0

次のようなファイルがあります。

1    a
3    b
2    b
9    a
0    a
5    c
8    b

私は…したい...

  1. 列 2 に存在する各要素の最後のインスタンスのみを、列 1 に対応する値とともに出力します。
  2. 列 2 の内容に基づいて、1. の結果をアルファベット順に並べ替えます。
  3. 列 1 の前に出力に 3 番目の列を追加します。この内容は、列 2 の値によって異なります。
  4. タブを改行で置き換えます。

... 単一の awk プログラムでこれらすべてを実行します。

したがって、最終的な出力は次のようになります。

x
0
a
x
8
b
y
5
c

私はこれをすべて成功させましたが、2 つの awk プログラムと 1 つの外部コマンドを使用しました。

awk -F '\t' '{
    value[$2]=$2"\t"$1 }
    END { for (i in value) print value[i]
    }' | \
sort -dfb | \
awk -F '\t' '{
if ($1 == "a" || $1=="b") print "x\n"$2"\n"$1
if ($1 == "c") print "y\n"$2"\n"$1
}'

これを行うより簡単な方法は、最初の awk プログラムの配列をアルファベット順にソートすることです。これにより、2 番目の awk プログラムの内容を最初の awk プログラムにマージできます。しかし、どうすればこれができるのかわかりません。何か案が ?

4

2 に答える 2

1

GNU awk <= 3 :

WHINY_USERS= awk 'END {
  for (R in r)
    printf "%s\n%s\n%s\n", 
      (R ~ /^[ab]$/ ? "x" : "y" ), r[R], R
  }
{
  r[$2] = $1
  }' infile

GNU awk >= 4 :

awk 'END {
  PROCINFO["sorted_in"] = "@ind_str_asc"
  for (R in r)
    printf "%s\n%s\n%s\n", 
      (R ~ /^[ab]$/ ? "x" : "y" ), r[R], R
  }
{
  r[$2] = $1
  }' infile
于 2012-09-03T12:43:55.337 に答える