5500 5700
5600 5800
5700 5800
5600 5900
5900 6100
5900 6100
5900 6100
5800 6000
5800 6100
5900 6100
5800 6200
5700 5800
上記のように、2つの列を持つファイルがあります。最初の列の2行ごとに最小値を見つけ、2番目の列の2行ごとに最大値を見つける必要があります。 awkを使ってこれを達成するには?希望の出力は
Min Max
5500 5800
5600 5900
5900 6100
5800 6100
5800 6100
5700 6200
答え1
$ awk 'BEGIN { print "Min", "Max" } {a=$1; b=$2; getline; print ($1<a?$1:a), ($2>b?$2:b)}' data.in
Min Max
5500 5800
5600 5900
5900 6100
5800 6100
5800 6100
5700 6200
このコードは、最初の列と2番目の列の現在の値をそれぞれおよびawk
変数に格納します。次に、次の行を明示的に読み取り、最初の列に最小値と新しい値を印刷し、2番目の列に最大値と新しい値を印刷します。a
b
a
b
($1 < a ? $1 : a)
三項演算子を使用して、?:
比較結果に基づいて値を比較して選択します。
タブ区切りの出力が必要な場合:
$ awk 'BEGIN {OFS="\t"; print "Min", "Max"} {a=$1; b=$2; getline; print ($1<a?$1:a), ($2>b?$2:b)}' data.in
Min Max
5500 5800
5600 5900
5900 6100
5800 6100
5800 6100
5700 6200
答え2
perl -pe '($_ .= <>) =~ s/(\d+) (\d+)\n(\d+) (\d+)/($3<$1 ? $3:$1).$".($4>$2 ? $4:$2)/e'
現在のレコードに次の行を追加し、$_
フィールド3 <-> 1(最小値)と4 <-> 2(最大値)を比較し、結果をレコード自体に入れます。-p
その後、結果は標準出力に送信されます。