我有以下数据
我想要做的是,对于每一行,如果末尾没有“555”,我想删除换行符 \n,并将其替换为空格。
因此,“匹配行”将是末尾没有“555”的行。我想替换这些行的换行符。
我的限制是不能使用 Perl 来完成这项工作。所以,只能使用 AWK 或 SED。但最好使用 AWK,因为我知道 SED 不太适合处理多行。
以下有 2 个示例:
示例 1
"abc","555"
"d
e
f","555"
"xyz","555"
"abc
d,e,f ghi
jkl
mnop,qrs","555"
应为(修订后)
"abc","555"
" d e f","555"
"xyz","555"
"abc d,e,f ghi jkl mnop,qrs","555"
&示例 2
"abc","555"
"d
e
f","555"
"xyz","555"
"aa
bb
cc
dd","555"
应为(修订后)
"abc","555"
"d e f","555"
"xyz","555"
"aa bb cc dd","555"
因此在需要的输出中,实际上每一行都有以下格式
"content","555"
答案1
在这种情况下,诀窍在于不要将其视为“在多条线路上工作”。
awk '/"555"$/ {print; next} {printf "%s ", $0}'
正常情况下,打印一组的最后一行,然后指示next
继续下一个输入行(不处理剩余命令)。剩余命令(成为默认情况)打印当前行,后跟空格,不带换行符。也可以这样做
awk '{if ($0 ~ /"555"$/) print; else printf "%s ", $0}'
答案2
我不熟悉 AWK,但你可以分两步完成,首先将“555”\n 替换为你在文件中永远不会遇到的内容,例如“555555555555555555########################################4444444444444444444444444444444444”。然后将所有 \n 替换为空格
随后将奇怪的字符串替换为“555”\n