把檔案每隔三行合併成一行(awk之RS、ORS與FS、OFS)

snale1989發表於2016-12-12

比如文字如下:
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

  1. i am a student.
  2. i like to swim
  3. hello moto

1代表第一個記錄行,2代表第二個記錄行,3代表第三個記錄行。通過觀察我們可以知道總共有3個記錄行(record)。

看看第一行:“i am a student”,這一行的每個單詞都是一個欄位(field)。“i”是一個欄位,“am”是一個欄位,“a”是一個欄位,“student”是一個欄位,該行總共有4個欄位。

RS與ORS

RS:記錄行分隔符

示例:

 

1.txt

  1. a\n
  2. b\n
  3. c\n
  4. d\n
  5. 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就是一個替換的過程。

相關文章