line ending對AWK print的影響

今天用awk的print想按照我想要的格式去打印,我的命令爲:

 awk 'BEGIN{ORS="\n"} {if(NR<30){print $0,  "hello"}}' payload.xml
由於payload.xml的數據過多,我只想打印前30行數據。結果如下:

 hello20002270008040FF010081DF02010381F40207FBE8040E03F0081FE7E01038007C207BCFD840E07DF081FEFBE100
 hello20002270008040FF010081DF02010381F40207FBE8040E03F0081FE7E01038007C207C10D840E07DF081FEFBE100
 hello20002270008040FF010081DF02010381F40207FBE8040E03F0081FE7E01038007C207F80F840E07DF081FEFBE100
 hello20002270008040FF010081DF02010381F40207FBE8040E03F0081FE7E01038007C207F80F840E369D081F3D3A100
 hello20002270008040FF010081DF02010381F40207FBE8040E03F0081FE7E01038007C207F80F840E3EBD081F4D7A100
每一行最前面都有一個空格,而且“hello”並沒有出現在$0的後面,相反,它還佔用了$的一些位數。

如果我把$0和"hello"的輸出換個順序,就是先輸出"hello",然後再輸出$0,結果就對了。

awk 'BEGIN{ORS="\n"} {if(NR<30){print $0,  "hello"}}' payload.xml
17844620002270008040FF010081DF02010381F40207FBE8040E03F0081FE7E01038007C207BCFD840E07DF081FEFBE100 hello
17844620002270008040FF010081DF02010381F40207FBE8040E03F0081FE7E01038007C207C10D840E07DF081FEFBE100 hello
17844620002270008040FF010081DF02010381F40207FBE8040E03F0081FE7E01038007C207F80F840E07DF081FEFBE100 hello
17844620002270008040FF010081DF02010381F40207FBE8040E03F0081FE7E01038007C207F80F840E369D081F3D3A100 hello
17844620002270008040FF010081DF02010381F40207FBE8040E03F0081FE7E01038007C207F80F840E3EBD081F4D7A100 hello
對這個奇怪的現象我無法給出合理的解釋。爲什麼僅僅是換了一下順序結果就會完全不一樣呢?如果我僅僅是輸出$0,後面不跟"hello",結果就是正確的,前面也不會出現空格。

然後我又用了printf函數,我猜想是不是print函數功能太簡單了,無法實現某些定製的行爲呢。結果printf函數也是同樣的結果。

這個每行最開始的空格究竟是爲啥出現的呢?

猛然間一下子想到會不會這個和文件的換行符有關係呢。因爲這個文件是在Windows下生成的,然後我把它拷到了一臺Linux機器中。在Vim中用set ff查看,果然文件格式是dos的,也就是Windows的。用dos2unix命令將該文件格式轉換爲Unix的,然後再試輸出就正確了。



發佈了83 篇原創文章 · 獲贊 38 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章