比如文字如下:
1
2
3
a
b
c
合併後的結果是:
1 2 3
a b c
#awk '{if(NR%3!=0)ORS=" ";else ORS="\n"}1' 5.txt
1 2 3
a b c
awk之RS、ORS與FS、OFS
轉自http://www.cnblogs.com/fhefh/archive/2011/11/16/2251656.html
RS:Record Separator,記錄分隔符
ORS:Output Record Separate,輸出當前記錄分隔符
FS:Field Separator,欄位分隔符
OFS:Out of Field Separator,輸出欄位分隔符
PS:RS、ORS、FS、OFS的英文解釋絕不是這樣的,這裡只是解釋清楚。建議去閱讀awk的英文讀物,其中解釋了縮寫的含義。
什麼是field(欄位),什麼是record(記錄行)?
示例:
1.txt
- i am a student.
- i like to swim
- hello moto
1代表第一個記錄行,2代表第二個記錄行,3代表第三個記錄行。通過觀察我們可以知道總共有3個記錄行(record)。
看看第一行:“i am a student”,這一行的每個單詞都是一個欄位(field)。“i”是一個欄位,“am”是一個欄位,“a”是一個欄位,“student”是一個欄位,該行總共有4個欄位。
RS與ORS
RS:記錄行分隔符
示例:
1.txt
- a\n
- b\n
- c\n
- d\n
- e\n
該文字總共有5行,每一行都有一個換行符“\n”。所以每行記錄都是以“\n”為一個(換行的)標誌。
可以用一下方法來理解:
找到某某標誌,讓每個某某後的內容重新變成一行
示例
1.txt
a|b|c
程式碼:awk 'BEGIN{ RS="|"; } { print $0 }'
a
b
b
ORS:可以看成RS的逆向過程
示例
1.txt
a
b
c
可以這樣理解:
觀察每一行的“換行符號”,然後將“換行符號”替換成你想要的符號。
awk 'BEGIN{ ORS="----" }{ print $0 }' 1.txt
a----b----c----
FS:欄位分隔符
FS預設值為“ (空格)”,如“hello moto”.
在“hello moto”中有一個空格,空格就是hello與moto的分隔符(separator),而hello與moto就為欄位(files)。awk以空格來區分。
在看看“i----love----you”,如果我們用命令“awk “{ print $1 }””會看到結果為:
i----love----you
如果想列印出三個字母,通過觀察可發現“----”為分隔符。
awk 'BEGIN{ FS="----";}{ print $1,$2,$3 }' filename
i love you
OFS:輸出的欄位分隔符。
這麼解釋吧,如上例中“i----love----you”,“----”為分隔符(FS),如果我們想改為用其他符號顯示可以這樣:
awk 'BEGIN{ FS="----";OFS="*****" }{ print $1,$2,$3 }' filename
i*****love*****you
其實OFS還有一個例子
echo "abc" | awk '{ OFS="." } { NF=NF; print NF,$0}'
結果
1.abc
PS:RS與ORS可以說成是一個互逆的過程(↔)也可以看成一個替換的過程,但是看成互逆的過程比較好理解;FS與OFS就是一個替換的過程。