何百もの行を持つテーブルがあります。
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
文字列内でどの文字をソートするかを制御できます。sort
X.Y
X,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