以下のようなファイルがあります。
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
出力の順序を気にしない場合:
$ 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
ああ、それは簡単なことです。以下は、ファイルに表示されるキーの順序を保持する単純なバージョンです。
_$ 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]]);
に置き換えてください。