4

awkでは、どうすればこれを行うことができますか?

入力:

1  a  f  1  12  v  
2  b  g  2  10  w  
3  c  h  3  19  x  
4  d  i  4  15  y  
5  e  j  5  11  z  

数値を$5次 の場所でソートすることにより、必要な出力

1  a  f  2  10  w  
2  b  g  5  11  z  
3  c  h  1  12  v  
4  d  i  4  15  y  
5  e  j  3  19  x  

並べ替えは、、、および(の値に基づいて)にのみ影響することに注意してください。この場合テーブル前の部分はそのまま残ります。$4$5$6$5

4

3 に答える 3

5

これは、次の助けを借りて複数のステップで行うことができますpaste

$ gawk '{print $1, $2, $3}' in.txt > a.txt
$ gawk '{print $4, $5, $6}' in.txt | sort -k 2 -n b.txt > b.txt
$ paste -d' ' a.txt b.txt
1 a f 2 10 w
2 b g 5 11 z
3 c h 1 12 v
4 d i 4 15 y
5 e j 3 19 x
于 2012-10-01T17:51:34.313 に答える
4

個人的には、awk重複するキーを保持して並べ替える必要があることが多いため、列の配列を安全に並べ替えるにはかなり注意が必要です。列のグループを選択的に並べ替える必要がある場合は、次pasteの支援を求めます。

paste -d ' ' <(awk '{ print $1, $2, $3 }' file.txt) <(awk '{ print $4, $5, $6 | "sort -k 2" }' file.txt)

結果:

1 a f 2 10 w
2 b g 5 11 z
3 c h 1 12 v
4 d i 4 15 y
5 e j 3 19 x
于 2012-10-02T01:07:46.493 に答える
4

これは純粋に行うことができawkますが、@ steveが言ったように、理想的ではありません。 gawkソート機能が制限されておりawk、ソートはまったく組み込まれていません。そうは言っても、ここに比較関数を使用した(かなりハック的な)ソリューションがありますgawk

[ghoti@pc ~/tmp3]$ cat text 
1  a  f  1  12  v  
2  b  g  2  10  w  
3  c  h  3  19  x  
4  d  i  4  15  y  
5  e  j  5  11  z  
[ghoti@pc ~/tmp3]$ cat doit.gawk 
### Function to be called by asort().
function cmp(i1,v1,i2,v2) {
  split(v1,a1); split(v2,a2);
  if (a1[2]>a2[2])      { return 1; }
  else if (a1[2]<a2[2]) { return -1; }
  else                  { return 0; }
}

### Left-hand-side and right-hand-side, are sorted differently.
{
  lhs[NR]=sprintf("%s %s %s",$1,$2,$3);
  rhs[NR]=sprintf("%s %s %s",$4,$5,$6);
}

END {
  asort(rhs,sorted,"cmp");    ### This calls the function we defined, above.
  for (i=1;i<=NR;i++) {       ### Step through the arrays and reassemble.
    printf("%s %s\n",lhs[i],sorted[i]);
  }
}    
[ghoti@pc ~/tmp3]$ gawk -f doit.gawk text 
1 a f 2 10 w
2 b g 5 11 z
3 c h 1 12 v
4 d i 4 15 y
5 e j 3 19 x
[ghoti@pc ~/tmp3]$ 

これにより、入力ファイル全体が配列に保持されるため、並べ替え後に行を再アセンブルできます。入力が数百万行の場合、これは問題になる可能性があります。

printfおよび関数を試して、sprintf適切な出力フィールドセパレータを設定することをお勧めします。

関数での使用に関するドキュメントasort()は、gawkのmanページにあります。を探しますPROCINFO["sorted_in"]

于 2012-10-03T14:06:01.527 に答える