此练习来自AWK one-liners explained blog post by Peteris Krumins
基本上就是这一行
awk '/\\$/ { sub(/\\$/,""); getline t; print $0 t; next }; 1'
将每行以反斜杠结尾的行连接到下一行:
e.g。输入
12345\
6789
523435\
00000
输出
123456789
52343500000
博客文章说: 不幸的是,这一个班轮无法加入超过2行(这是留给读者的练习,以提出一个连接任意数量的以反斜杠结尾的行的单行:)。)。
所以使用上面的AWK单行,如果你使用一个接一个的输入文件,一个接一个地在末尾有一个反斜杠(input2),给出一个不正确的答案(output2) 例如输入2
12345\
6789\
523435\
00000
输出2 - INCORRECT
123456789\
52343500000
我认为,根据帖子,输出应该是output3:
输出3 - 正确
12345678952343500000
如何解决这个问题(输入为input2并获取output3)?
答案 0 :(得分:5)
尝试以下方法:
awk '/\\$/ { printf "%s", substr($0, 1, length($0)-1); next } 1' <<'EOF'
12345\
6789\
523435\
00000
EOF
产生
12345678952343500000
这表明 3 连续(或更多)续行可以正常工作,与问题中的命令不同。
命令说明:
/\\$/
匹配行末(\
)的$
,表示信号行延续。substr($0, 1, length($0)-1)
从输入行\
中删除尾随$0
。printf "%s"
,打印(修改后的)当前行没有尾随换行符,这意味着接下来的任何打印命令都将直接附加到它,有效地加入当前行和下一行。next
完成当前行的处理。1
是一种常见的awk
成语,是{ print }
的简写,即只是打印输入行(尾随\n
)。至于为什么原始命令不起作用:
awk '/\\$/ { sub(/\\$/,""); getline t; print $0 t; next }; 1
\
)时,getline t
从文件中读取 next 行并将其打印出来在当前行之后。next
然后完成当前的处理和 - 感谢getline
调用 - next 行,以便下一个脚本周期处理行 next 行之后(当前的 2 行)。getline
读取的行是盲目打印而不是以任何方式检查,因此对于行继续字符处理,跳过。一般情况下,正如Ed Morton在评论中指出的那样,使用getline
很少是正确的解决方案并且可能导致微妙的错误 - 请参阅http://awk.info/?tip/getline。