簡體   English   中英

awk將記錄分隔符(RS)更改為每2行

[英]awk to change the record separator (RS) to every 2 lines

我想知道如何使用Awk處理每兩行數據而不是每一行。 默認情況下,記錄分隔符(RS)設置為每個新行,如何將其更改為每2行。

這取決於您想要實現的目標,但一種方法是使用getline指令。 對於每一行,請閱讀下一行並將其保存在變量中。 因此,您將在$0獲得第一行,在even_lineeven_line第二even_line

getline even_line

分而治之:分兩步完成:

  1. 用awk引入空行
    將每個兩行記錄分開: NR%2==0 {print ""}
  2. 管道到另一個awk進程和
    將記錄分隔符設置為空行: BEGIN {RS=""}

優點:在第二個awk過程中,您可以將兩行中的所有字段都顯示為$1 to $NF

awk '{print}; NR%2==0 {print ""}' data | \
awk 'BEGIN {RS=""}; {$1=$1;print}'

注意:
$1=$1用於強制執行$0更新(整個記錄)。
這保證輸出在一行上打印兩行記錄。
在處理兩行記錄時修改程序中的字段后,就不再需要這樣做了。

如果要合並線條,請使用paste實用程序:

$ printf "%s\n" one two three four five
one
two
three
four
five

$ printf "%s\n" one two three four five | paste -d " " - -
one two
three four
five 

這有點hackish,但它是你的問題的字面答案:

awk 'BEGIN {RS = "[^\n]*\n[^\n]*\n"} {$0 = RT; print $1, $NF}' inputfile

將記錄分隔符設置為匹配兩行的正則表達式。 然后對於每一行,將$0設置$0記錄終止符(這與RS的正則表達式匹配)。 這將在FS上執行字段拆分。 打印聲明只是一個示范占位符。

請注意, $0將包含兩個換行符,但這些字段不包含任何換行符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM