6

Awk を使用して、1 行ごとではなく 2 行ごとにデータを処理する方法を考えています。デフォルトでは、レコード セパレータ (RS) は新しい行ごとに設定されています。これを 2 行ごとに変更するにはどうすればよいですか。

4

4 に答える 4

6

何を達成したいかによって異なりますが、1 つの方法はgetline命令を使用することです。各行について、次の行を読み取り、変数に保存します。したがって、最初の行$0と次の行が次のようになりeven_lineます。

getline even_line
于 2012-08-11T09:57:35.990 に答える
5

行をマージする場合は、次の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 
于 2012-08-11T11:54:27.807 に答える
5

分割統治: 2 つのステップで実行します。

  1. awk を使用して空白行を挿入
    し、各 2 行のレコードを区切ります。NR%2==0 {print ""}
  2. 別の 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

于 2012-08-11T09:55:52.057 に答える
4

これは少しハックですが、質問に対する文字通りの答えです。

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

レコード セパレータを 2 行に一致する正規表現に設定します。次に、各行$0にレコード ターミネータを設定します (これは の正規表現と一致しRSます)。これにより、 でフィールド分割が実行されFSます。print ステートメントは単なるデモンストレーションのプレースホルダーです。

$0には 2 つの改行が含まれますが、フィールドには改行が含まれないことに注意してください。

于 2012-08-11T21:24:50.963 に答える