同じ開始フィールドを持つ行のマージ

同じ開始フィールドを持つ行のマージ

私はbashツールを使って次の2つの関連問題を解決したいと思います。

1。次の行を含むファイルがあるとします。

A foo1
B bar
A foo2
A foo3 foo4
C ccc

同じ開始フィールドを持つ行をマージする方法は?つまり、次のような結果を得たいと思います。

A foo1 foo2 foo3 foo4
B bar
C ccc

2。最初の操作を完了した後、各行に重複したフィールドがある可能性があります。たとえば、foo2はfoo4と同じです。重複したアイテムを削除してそのうちの1つだけを維持するにはどうすればよいですか(例:foo2のみを保持)。これは各行に対して実行する必要がありますが、行間の重複は気にしません。

背景:私が辞書を作ると思うかもしれません。各行の開始フィールドは単語で、次のフィールドはその意味です。

答え1

$ awk '
    { for (i=2; i<=NF; i++) if (!seen[$1,$i]++) map[$1] = map[$1] OFS $i }
    END { for (key in map) print key map[key] }
' file
A foo1 foo2 foo3 foo4
B bar
C ccc

上記は出力ラインの順序に興味がないと仮定している。

答え2

cat - <<\eof > file
A foo1
B bar
A foo2
A foo3 foo2
C ccc
eof

awk '
{
  word = $1
  for (i=2; i<=NF; i++) {
    meaning = $i
    sep = (!(word in dict) ? "" : OFS)
    dict[word] = dict[word] \
     (!seen[meaning]++ ? sep meaning : "")
  }
}
END {
  for (word in dict)
    print word, dict[word]
}
' file

A foo1 foo2 foo3
B bar
C ccc

関連情報