1

次のようなファイルがあります。

ファイル.dat

1 2
1 3
2 1
2 4
2 3
3 4

左の列はソートされています。次のような新しいファイルを書きたいと思います。

1 2 3
2 1 4 3
3 4

最初の列は file.dat の左の列番号で、その隣に右の列番号があります。何か助けはありますか?

4

5 に答える 5

3
#!/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
于 2013-02-01T21:41:23.243 に答える
2

あなたはすでにあなたの受け入れられた答えを持っています。ただし、興味深い問題のために、別のより単純な (おそらく) 短いワンライナーを追加したいと思います。

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
于 2013-02-02T00:01:46.133 に答える
2

これも機能します

awk '{a[$1]=a[$1]$2" "} END {for (i in a) {print i,a[i]}}' temp.txt

于 2013-02-02T07:35:30.967 に答える
0

を使用する 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
于 2013-02-02T01:00:43.397 に答える