1

awk、sort、または複数列の CSV テーブルの 1 つの列を並べ替えたり逆にしたりして、残りを同じ順序で維持するために使用する単一のステップの方法はありますか?

たとえば、私は持っています:

6, 45, 9
5, 47, 6
4, 46, 7
3, 48, 4
2, 10, 5
1, 11, 1

したい:

1, 45, 9
2, 47, 6
3, 46, 7
4, 48, 4
5, 10, 5
6, 11, 1  

したがって、最初の列のみが並べ替えられ、残りは以前の順序になります。

4

3 に答える 3

2

これはあなたのために働くかもしれません:

paste -d, <(cut -d, -f1 file | sort) <(cut -d, -f2- file)
于 2013-01-12T19:01:04.280 に答える
1

awkワンライナー

awk -F, '{c[NR]=$1;l[NR]=$2", "$3}END{for(i=1;i<=NR;i++) print c[NR-i+1]", "l[i]}' file

テスト

kent$  echo "6, 45, 9
5, 47, 6
4, 46, 7
3, 48, 4
2, 10, 5
1, 11, 1"|awk -F, '{c[NR]=$1;l[NR]=$2", "$3}END{for(i=1;i<=NR;i++) print c[NR-i+1]", "l[i]}'
1,  45,  9
2,  47,  6
3,  46,  7
4,  48,  4
5,  10,  5
6,  11,  1
于 2013-01-12T19:31:27.657 に答える
0

GNU awkここにワンライナーがある場合:

$ gawk '{s[NR]=$1;c[NR]=$2 $3}END{for(i=0;++i<=asort(s);)print s[i] c[i]}' file
1,45,9
2,47,6
3,46,7
4,48,4
5,10,5
6,11,1

そうでない場合は、awk単純なバブル ソートを実装するスクリプトを次に示します。

{ # read col1 in sort array, read others in col array
  sort[NR] = $1
  cols[NR] = $2 $3
}
END { # sort it with bubble sort
    do {
    haschanged = 0
    for(i=1; i < NR; i++) {
      if ( sort[i] > sort[i+1] ) {
    t = sort[i]
    sort[i] = sort[i+1]
    sort[i+1] = t
    haschanged = 1
      }
    }
  } while ( haschanged == 1 )

  # print it
  for(i=1; i <= NR; i++) {
      print sort[i] cols[i]
  }
}

ファイルに保存して実行sort.awkしますawk -f sort.awk file

$ awk -f sort.awk file
1,45,9
2,47,6
3,46,7
4,48,4
5,10,5
6,11,1
于 2013-01-12T19:47:36.003 に答える