次のようなファイルがあります。
ファイル.dat
1 2
1 3
2 1
2 4
2 3
3 4
左の列はソートされています。次のような新しいファイルを書きたいと思います。
1 2 3
2 1 4 3
3 4
最初の列は file.dat の左の列番号で、その隣に右の列番号があります。何か助けはありますか?
#!/bin/bash
awk -f <(cat - <<-'EOF'
{
b[$1, a[$1]++] = $2;
}
END {
for (i in a) {
printf "%d ", i;
for (j = 0; j < a[i]; j++) {
printf "%d ", b[i, j];
}
print ""
}
}
EOF
) < /dev/stdin
出力:
$ ./script.sh < file.dat
1 2 3
2 1 4 3
3 4
このスクリプトは で実行されawk
ます。名前の場合file.awk
:
{
b[$1, a[$1]++] = $2;
}
END {
for (i in a) {
printf "%d ", i;
for (j = 0; j < a[i]; j++) {
printf "%d ", b[i, j];
}
print ""
}
}
次のように実行します。
awk -f file.awk < file.dat
あなたはすでにあなたの受け入れられた答えを持っています。ただし、興味深い問題のために、別のより単純な (おそらく) 短いワンライナーを追加したいと思います。
awk '$1 in a{a[$1]=a[$1]" "$2;next}{a[$1]=$0}END{for(i in a)print a[i]}' file
あなたの例で動作することを確認するには:
kent$ cat test.txt
1 2
1 3
2 1
2 4
2 3
3 4
kent$ awk '$1 in a{a[$1]=a[$1]" "$2;next}{a[$1]=$0}END{for(i in a)print a[i]}' test.txt
1 2 3
2 1 4 3
3 4
これも機能します
awk '{a[$1]=a[$1]$2" "} END {for (i in a) {print i,a[i]}}' temp.txt
を使用する 1 つの方法を次に示しawk
ます。
awk '{ a[$1] = (a[$1] ? a[$1] FS : "") $2 } END { for (i in a) print i, a[i] | "sort" }' file
結果:
1 2 3
2 1 4 3
3 4