次の単一値列を含む入力ファイルがあります。
入力ファイル:
B00000|1|def|b12
B00001|1|xyz|
B00000|1||b11
B00001|1|def|ab1
B00001|2|ghi|bc2
B00002|1|abc|ac1
B00002|1|xyz|bc2
出力を取得するには、1列目と2列目に基づいて3列目と4列目のデータを分離する必要があります。
出力:
B00000|1|def|b11,b12
B00001|1|def,xyz|ab1
B00001|2|ghi|bc2
B00002|1|abc,xyz|ac1,bc2
答え1
#!/usr/bin/gawk -f
BEGIN { OFS=FS="|"}
a[$1][$2][3] { a[$1][$2][3] = a[$1][$2][3] "," $3;
a[$1][$2][4] = a[$1][$2][4] "," $4;
next }
{ a[$1][$2][3] = $3;
a[$1][$2][4] = $4 }
END { for (b in a)
for(c in a[b]) print b,c,a[b][c][3],a[b][c][4] }
awk対応部分については、以下の@dave_thompson_085の説明を参照してください(1D配列を使用)。
答え2
$ cat ip.txt
B00000|1|def|b12
B00001|1|xyz|a11
B00000|1|abc|b11
B00001|1|def|ab1
B00001|2|ghi|bc2
B00002|1|abc|ac1
B00002|1|xyz|bc2
$ perl -ne '($k,$v1,$v2)=/([^|]+\|[^|]+\|)([^|]+)\|([^ ]*)/;
$h1{$k}.=$h1{$k}?",$v1":$v1; $h2{$k}.=$h2{$k}?",$v2":$v2;
END{ foreach (keys %h1){print "$_$h1{$_}|$h2{$_}\n"} }
' ip.txt
B00001|2|ghi|bc2
B00002|1|abc,xyz|ac1,bc2
B00000|1|def,abc|b12,b11
B00001|1|xyz,def|a11,ab1
- 入力ラインは3つの部分に分けられます(例:
B00000|1|
、def
および)b12
。行の末尾のスペースは無視されます。 - 同じキーを持つ2つの異なるハッシュ変数にはvalue
$v1
と$v2
が追加されます。,
キーのハッシュが空でない場合は追加 - すべての行が処理された後に出力を印刷します。
入力とキーが揃った場合:
$ sort ip.txt | perl -ne '($k,$v1,$v2)=/([^|]+\|[^|]+\|)([^|]+)\|([^ ]*)/;
$h1{$k}.=$h1{$k}?",$v1":$v1; $h2{$k}.=$h2{$k}?",$v2":$v2;
END{ foreach (sort keys %h1){print "$_$h1{$_}|$h2{$_}\n"} }'
B00000|1|abc,def|b11,b12
B00001|1|def,xyz|ab1,a11
B00001|2|ghi|bc2
B00002|1|abc,xyz|ac1,bc2