想要将 2 行合并为一行,并在 unix 中使用结束模式 ABC 避免使用正确的行

想要将 2 行合并为一行,并在 unix 中使用结束模式 ABC 避免使用正确的行

我有如下文件:

07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-2034
55
07-10-2021-Aad-hello-20345
5
07-10-2021-dafC-hello-203
455

我想要的输出如下:

07-10-2021-ABC-hello-203455
07-10-2021-aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafc-hello-203455

可以帮忙查询一下吗?我尝试使用sed但没有成功。我想跳过正确的行,并且需要在unix中合并不正确的2行。

答案1

我使用plus找到了这个解决方案1sedawk

$ sed 's/^\([0-9]*\)$/#\1/' file | awk -v RS= '{ gsub(/\n#/, "", $0); print }'
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

1我确信只需sed 或者 awk,但到目前为止我还无法使其发挥作用。

答案2

使用用于多字符 RS 和 RT 的 GNU awk:

$ awk -v RS='[0-9]{2}(-[^-]*){5}\n' '
    { print gensub(/\n/,"","g",RT) }
' file
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

否则使用任何 awk:

$ awk '
    /^([0-9]{2}-){2}[0-9]{4}-/ {
        printf "%s%s", prev, $0
        prev = ORS
        next
    }
    { prev = $0 ORS }
    END {
        printf "%s", prev
    }
' file
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

答案3

这是使用 awk 的一种方法。这假设“正确”的行是包含字符串的行hello。如果标准不同,只需将正则表达式更改/hello/为其他类似/-/length($0) > 10或任何您需要的内容:

$ awk '/hello/&&prev{print prev}/hello/{prev=$0;next}{prev=prev $0}END{if(prev)print prev}' file
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455

以更易读的格式:

awk '
  /hello/ && prev {print prev}
  /hello/ {prev = $0; next}
  {prev = prev $0}
  END {if (prev) print prev}
' file

另一个测试有更多损坏的文件:

$ cat file2
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-2034
55
111
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-20345
5
07-10-2021-dafC-hello-203
455
07-10-2021-dafC-hello-203

$ awk '
  /hello/ && prev {print prev}
  /hello/ {prev = $0; next}
  {prev = prev $0}
  END {if (prev) print prev}' file2
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-ABC-hello-203455
07-10-2021-Aer-hello-203455111
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-20345
07-10-2021-Aad-hello-203455
07-10-2021-dafC-hello-203455
07-10-2021-dafC-hello-203

答案4

首先,如果所有正确的行中都有“hello”,则可以通过命令生成此输出

cat YourFile | grep hello

如果您想列出不正确的行并将它们合并为 1 行,请使用它来显示它们由“,”分隔

cat YourFile | grep -v hello | paste -s -d, - 

该命令后的输出是

55,5,455

相关内容