awk を使用してテーブルの行を並べ替えます。

awk を使用してテーブルの行を並べ替えます。

何百もの行を持つテーブルがあります。

a1 
a2 
a3 
a4 
b1 
b2 
b3 
b4 
c1 
c2 
c3 
c4
... etc.

次の順序で商品を返品したいと思います。

a1
b1
c1
d1
a2
b2
c2
d2
a3
b3
c3

次のスクリプトはブロックの最初の行を選択します。

$ awk '{if(NR==1||NR%4==1)print}'

しかし、ファイル全体に対してこれを行うにはどうすればよいですか?

答え1

これをsort使ってソートできます。特に、アルファベット順と数値順の並べ替えを処理する一般的な並べsort替えを実行するように指示できます。より一般的なシンボルの代わりにシンボルを使用して、g文字列内でどの文字をソートするかを制御できます。sortX.YX,Y

たとえば、

$ sort -k1.2g file
a1
b1
c1
a2
b2
c2
a3
b3
c3
a4
b4
c4

ソートオプション:

  -k, --key=KEYDEF
          sort via a key; KEYDEF gives location and type
  -g, --general-numeric-sort
         compare according to general numerical value

  KEYDEF is F[.C][OPTS][,F[.C][OPTS]] for start and stop position, where F is
  a field number and C a character  position in the field; both are origin 1,
  and the stop position defaults to the line's end.  If neither -t nor -b is 
  in effect, characters in a field are counted from the beginning of the 
  preceding whitespace.  OPTS is one or  more  single-letter ordering options
  [bdfgiMhnRrV],  which  override  global ordering options for that key.  If 
  no key is given, use the entire line as the key.

答え2

「ステップサイズ」が常に小さい場合(あなたの場合は4)、迅速で汚れたアプローチは、単にファイルを複数回読み、各オフセットからレコードを選択することです。

awk 'FNR==1 {k++} !((FNR-k)%4)' file file file file
a1 
b1 
c1 
a2 
b2 
c2 
a3 
b3 
c3 
a4 
b4 
c4

または、同様にGNU Awk(およびそのBEGINFILE規則)を使用してください。

gawk 'BEGINFILE{k++} !((FNR-k)%4)' file file file file

関連情報