加入以反斜杠结尾的行,下一行是awk(来自Famous awk one-liners解释)

时间:2015-05-05 22:52:41

标签: bash awk sed

此练习来自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)?

1 个答案:

答案 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