以下のファイルがあります。
abc, 12345
def, text and nos
ghi, something else
jkl, words and numbers
abc, 56345
def, text and nos
ghi, something else
jkl, words and numbers
abc, 15475
def, text and nos
ghi, something else
jkl, words and numbers
abc, 123345
def, text and nos
ghi, something else
jkl, words and numbers
次に変換(結合)したいと思います。
abc, 12345, 56345, 15475, 123345
def, text and nos, text and nos,text and nos,text and nos
ghi, something else, something else, something else, something else
jkl, words and numbers, words and numbers, words and numbers, words and numbers
答え1
出力順序が気に入らない場合は、次のようにします。
$ awk -F',' 'NF>1{a[$1] = a[$1]","$2};END{for(i in a)print i""a[i]}' file
jkl, words and numbers, words and numbers, words and numbers, words and numbers
abc, 12345, 56345, 15475, 123345
ghi, something else, something else, something else, something else
def, text and nos, text and nos, text and nos, text and nos
説明する
NF>1
つまり、空でない行だけを処理するだけです。- すべての最初のフィールドを連想配列に保存します
a
。キーは最初のフィールドで、値は2番目のフィールド(または行の残りの部分)です。キーにすでに値がある場合は、2つの値を連結します。 END
ブロック内で連想配列を繰り返して、a
すべてのキーとその値を印刷します。
または、次のperl
順序を維持します。
$perl -F',' -anle 'next if /^$/;$h{$F[0]} = $h{$F[0]}.", ".$F[1];
END{print $_,$h{$_},"\n" for sort keys %h}' file
abc, 12345, 56345, 15475, 123345
def, text and nos, text and nos, text and nos, text and nos
ghi, something else, something else, something else, something else
jkl, words and numbers, words and numbers, words and numbers, words and numbers
答え2
ああ、それは簡単です。以下は、ファイルに表示される順序でキーを保持する簡単なバージョンです。
$ awk -F, '
/.+/{
if (!($1 in Val)) { Key[++i] = $1; }
Val[$1] = Val[$1] "," $2;
}
END{
for (j = 1; j <= i; j++) {
printf("%s %s\n%s", Key[j], Val[Key[j]], (j == i) ? "" : "\n");
}
}' file.txt
出力は次のようになります。
abc, 12345, 56345, 15475, 123345
def, text and nos, text and nos, text and nos, text and nos
ghi, something else, something else, something else, something else
jkl, words and numbers, words and numbers, words and numbers, words and numbers
最後に追加の空白行が気に入らない場合は、行をprintf
次のように置き換えます。printf("%s %s\n\n", Key[j], Val[Key[j]]);