1

タブで区切られた列を持つ非常に幅の広いファイルがあります。

Donna   25.07.83   Type1   A   B   C   D  E   F   G   H  ....
Adam    17.05.78   Type2   A   B   C   D  E   F   G   H  ....

すべてを印刷したいのですが、3 列目以降は 2 列ごとにタブを印刷します。

Donna   25.07.83   Type1   AB   CD  EF   GH  ....
Adam    17.05.78   Type2   AB   CD  EF   GH  ....

おそらくこれよりも賢い方法があると思います

awk '{OFS="\t"} {print $1, $2, $3, $4$5, $6$7, $8$9}' 

特に私のファイルには 1000 を超える列が含まれているためです。awkはこれを行うことができますか?

4

2 に答える 2

1

かなり厄介ですが、機能します:

awk '{printf "%s\t%s\t%s",$1,$2,$3; for(i=4;i<=NF;i+=2) printf "\t%s%s",$i,$(i+1); print ""}' wide.txt

NFawk変数であり、その値は、現在の行にある列の数を示す数値です。マニュアルに記載されています。

それを分解しましょう:

#!/usr/bin/awk -f

{ 
  printf "%s\t%s\t\%", $1, $2, $3;  # print the first 3 columns, explicitly 
                                    # separated by TAB. No NEWLINE will be printed.

  # We want to print the remaining columns in pairs of $4$5, $6$7

  for( i = 4; i <= NF ; i+=2 )       # i is 4, then 6, then 8 ... till NF (the num. of the final column)
     printf "\t%s%s", $i, $(i+1);   # print \t$4$5, then \t$6$7, then \t$8$9 

  print ""                          # We haven't print the end-of-line NEWLINE
                                    # yet, so this empty print should do it.
}
于 2013-03-04T09:02:54.197 に答える
1
awk '{for(i=1;i<=NF;i++){if(i>=4){$i=$i$(i+1);$(i+1)="";i+=1}}print}' your_file

テスト済み:

> cat temp
Donna   25.07.83   Type1   A   B   C   D  E   F   G   H
Adam    17.05.78   Type2   A   B   C   D  E   F   G   H
> awk '{for(i=1;i<=NF;i++){if(i>=4){$i=$i$(i+1);$(i+1)="";i+=1}}print}' temp
Donna 25.07.83 Type1 AB  CD  EF  GH 
Adam 17.05.78 Type2 AB  CD  EF  GH 
于 2013-03-04T09:10:50.133 に答える