Awk を使用して、1 行ごとではなく 2 行ごとにデータを処理する方法を考えています。デフォルトでは、レコード セパレータ (RS) は新しい行ごとに設定されています。これを 2 行ごとに変更するにはどうすればよいですか。
4 に答える
何を達成したいかによって異なりますが、1 つの方法はgetline
命令を使用することです。各行について、次の行を読み取り、変数に保存します。したがって、最初の行$0
と次の行が次のようになりeven_line
ます。
getline even_line
行をマージする場合は、次の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
分割統治: 2 つのステップで実行します。
- awk を使用して空白行を挿入
し、各 2 行のレコードを区切ります。NR%2==0 {print ""}
- 別の awk プロセスにパイプし、
レコード区切りを空白行に設定します。BEGIN {RS=""}
利点: 2 番目のawk
プロセスでは、2 行のすべてのフィールドに としてアクセスできます$1 to $NF
。
awk '{print}; NR%2==0 {print ""}' data | \
awk 'BEGIN {RS=""}; {$1=$1;print}'
注:ここでは、 (レコード全体)
$1=$1
の更新を強制するために使用されます。
これにより、出力で 2 行のレコードが 1 行に印刷されることが保証されます。
2 行のレコードを処理するときにプログラムでフィールドを変更すると、これは不要になります。$0
これは少しハックですが、質問に対する文字通りの答えです。
awk 'BEGIN {RS = "[^\n]*\n[^\n]*\n"} {$0 = RT; print $1, $NF}' inputfile
レコード セパレータを 2 行に一致する正規表現に設定します。次に、各行$0
にレコード ターミネータを設定します (これは の正規表現と一致しRS
ます)。これにより、 でフィールド分割が実行されFS
ます。print ステートメントは単なるデモンストレーションのプレースホルダーです。
$0
には 2 つの改行が含まれますが、フィールドには改行が含まれないことに注意してください。