awkまたはsedを介して最初の列に行を結合する

awkまたはsedを介して最初の列に行を結合する

awk次の状況ではどのように使用しますか?

同じ列で始まる行を連結したいと思います。結合後、最初の列(この場合)のみがaaa保持されwwwますhhh

ファイルはスペースまたはタブで区切ることができます。

入力例:

aaa bbb ccc ddd NULL NULL NULL
aaa NULL NULL NULL NULL NULL NULL
aaa bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy
hhh 111 333 yyy ooo hyy NULL

希望の出力:

aaa bbb ccc ddd NULL NULL NULL NULL NULL NULL NULL NULL NULL bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy 111 333 yyy ooo hyy NULL

背景は、最初の列が常にエンティティの識別子である非常に単純なファイルベースのデータベースを構築したいということです。同じ識別子列に基づくすべての行が連結されます。

ベストアンサー1

awkを使用して各行の最初の列を取得するには、次のようにします。

< testfile awk '{print $1}'
aaa
aaa
aaa
www
hhh
hhh

これは残りの行のキーです。したがって、行の最初の列をキーとして使用し、行の2番目の列を値としてハッシュテーブルを作成できます。

< testfile awk '{table[$1]=table[$1] $2;} END {for (key in table) print key " => " table[key];}'
www => yyy
aaa => bbbNULLbbb
hhh => 111111

残りの行(2列目から始まる)を取得するには、すべての列を収集する必要があります。

< testfile awk '{line="";for (i = 2; i <= NF; i++) line = line $i " "; table[$1]=table[$1] line;} END {for (key in table) print key " => " table[key];}'
www => yyy hhh NULL NULL NULL NULL 
aaa => bbb ccc ddd NULL NULL NULL NULL NULL NULL NULL NULL NULL bbb ccc    NULL NULL NULL NULL 
hhh => 111 333 yyy ooo hyy uuuioooy 111 333 yyy ooo hyy NULL 

おすすめ記事