AWK改變輸入輸出分隔符實例分析


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指定為"",手動輸出換行符。這個就是最開始的命令了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM