awk默認從STDIN接受數據,打印文本到STDOUT。
awk的默認輸入和輸出分隔符:
FS : 輸入字段分隔符,默認空格。
RS : 輸入行分隔符,默認\n。
OFS : 輸出字段分隔符,默認空格。
ORS : 輸出行分隔符,默認\n。
實例:通過改變默認的內置變量使多行變成一行
file.txt ( 每個人的信息條數不確定,區分是一個空行 )
路人甲
電話:13777707771
手機:010-12345678
路人乙
電話:13912344321
手機:010-56784321
QQ: 87654221
想要把格式變為:
路人甲 電話:13777707771 手機:010-12345678
路人乙 電話:13912344321 手機:010-56784321 QQ: 87654221
先給出最終命令,再看分析。
awk 'BEGIN{FS="\n";RS="";ORS=""}{for(x=1;x<=NF;x++){print $x"\t"} print "\n"}' ./t.txt
分析:
改變FS為\n,這樣讀入域就是一行,再改變RS為"",這樣就會把一個人的信息讀入為一行。現在就是兩行數據了。下一步就是輸出。
因為默認的OFS就是空格,ORS就是\n,這就是我們想要的,所以
awk 'BEGIN{FS="\n";RS=""}{print $1,$2,$3,$4}' ./t.txt
輸出的結果為:
路人甲 電話:13777707771 手機:010-12345678
路人乙 電話:13912344321 手機:010-56784321 QQ: 87654221
這就是我們想要的結果,但是從$1輸出到$4不是個好主意,假設一個人最多的記錄不止4行呢。
這時我想直接print $0不就行了,和 print $1,$2,$3,$4不是一樣的,可結果卻是:
awk 'BEGIN{FS="\n";RS=""}{print $0}' ./t.txt
路人甲
電話:13777707771
手機:010-12345678
路人乙
電話:13912344321
手機:010-56784321
QQ: 87654221
和想要的結果有些差別呢,為什么呢?因為OFS在輸出$0時不起作用,OFS只用在輸出多個域時會插入到每個域之間。
這時我想那就用for循環把每行的每個域print出來好了。於是
awk 'BEGIN{FS="\n";RS=""}{for(x=1;x<=NF;x++){print $x}}' ./t.txt
路人甲
電話:13777707771
手機:010-12345678
路人乙
電話:13912344321
手機:010-56784321
QQ: 87654221
結果好像沒什么變化,因為for循環的每個print之后會輸出一個ORS,可以指定一個可見的ORS試試看就知道了。
所以需要把ORS指定為"",手動輸出換行符。這個就是最開始的命令了。
