%E5%88%97%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%84%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E5%80%8B%E5%88%A5%E3%81%AB%E7%B5%90%E5%90%88.png)
次のようにタブ区切りのテストデータがあります。
A 1 2
B 3 4
B 5 6
C 7 8
次のように、列1の重複値に基づいて列2と3を結合(集計)したいと思います。
A 1 2
B 3;5 4;6
C 7 8
ここで、ソリューションに基づいて開発した作業コード(列1に基づいて複数行をマージ) は複数の列の値を個別にマージしません。
<test.txt awk -F"\t" '{OFS="\t"} {a[$1]=($1 in a)?a[$1]";"$2FS$3:$1FS$2FS$3} END{for(i in a){print a[i]}}'
A 1 2
B 3 4;5 6
C 7 8
誰かが私のコードのエラーを指摘するのを手伝ってくれたらとても感謝します。いくつかのバリエーションを試しましたが、正しい形式にすることはできません。
答え1
各列に関連付けられた値を含めるには、別々の変数を使用します。
awk -F'\t' -v OFS='\t' '{
if ($1 in a) {
a[$1] = a[$1]";"$2;
b[$1] = b[$1]";"$3;
} else {
a[$1] = $2;
b[$1] = $3;
}
}
END { for (i in a) print i, a[i], b[i] }' < test.txt
答え2
少し遅れていますが、合成サブ配列を使用する代替は次のとおりです。
awk -v OFS='\t' '{
if ($1 in arr) {
split(arr[$1], subArr);
arr[$1] = subArr[1] ";" $2 OFS subArr[2] ";" $3;
}
else {
arr[$1] = $2 OFS $3
} }
END {
for (i in arr) print i,arr[i];
}'