我有如下文件:
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找到了这个解决方案1:sed
awk
$ 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