awkOFS问题
awk改变了OFS,$0却没变化
一个文件1.txt,内容如下
a b c d e
目的把列变行,输出为: a b c d e
脚本如下:
awk 'BEGIN{RS="";FS="\n";OFS=" "}{print }' test a b c d e
理论上应该实现我们想要的 a b c d e
问题出在这里
Understanding $0
It is a not-uncommon error to try to change the field separators in a record simply by setting FS and OFS, and then expecting a plain ‘print’ or ‘print $0’ to print the modified record. But this does not work, since nothing was done to change the record itself. Instead, you must force the record to be rebuilt, typically with a statement such as ‘$1 = $1’, as described earlier. |
google翻译:
重要的是要记住,$ 0是完整的记录,与从输入读取完全一样。 这包括任何前导或尾随空白以及分隔字段的确切空格(或其他字符)。
尝试通过设置FS和OFS来更改记录中的字段分隔符是常见的错误,然后期待一个普通的“打印”或“打印$ 0”来打印修改的记录。
但是这并不奏效,因为没有改变记录本身。 相反,您必须强制重新创建记录,通常使用诸如“$ 1 = $ 1”的语句,如前所述。
It works !
quke@Raphaelqu:/tmp$ awk 'BEGIN{RS="";FS="\n";OFS=" "}{$1=$1;print}' 1.txt
a b c d e f g
详情参考:
http://www.gnu.org/software/gawk/manual/html_node/Changing-Fields.html