awkを使用して3行目にスキップする方法

awkを使用して3行目にスキップする方法

ファイルを整理するのに役立つ人はいますか? awkを使用して、以下の例に基づいて3行ごとにスキップしたいと思います。

現在のファイル:

a
a
a
a
b
b
b
b
c
c
c
c

希望の出力:

a
b
c

答え1

$ awk 'NR%4==0 { print $0, "in line#", NR }' infile
a in line# 4
b in line# 8
c in line# 12

だから:

awk 'NR%4==0' infile

最初の行を印刷するには、に変更してawk 'NR%4==1'から、次の3行をスキップします。

答え2

GNUの使用sed:

$ sed -n '1~4p' filename
a
b
c

答え3

使用awk:

awk '{ print; getline; getline; getline}' file

getlineファイルの次の行に移動します。ねえ。何もしない場合は、awk次の行に進みます。

この例では3回使用されていますが、getline何もしないので、awk3行をスキップしました。

他の用途getline

興味深いことにgetline < "other_file"、このコマンドは他のファイルから1行を読み取るために使用されます。

getlineただし、これらの問題には通常 of を使用することは推奨されず、結果をテストせずにこのように組み込み変数を埋めることはお勧めできません。http://awk.freeshell.org/AllAboutGetlineいつ、どのように使用するかをご覧くださいgetline

またはawk配列と共に使用してください。

awk '{arr[NR]=$0; }END{ for(i=1;i<=NR;i=i+3) print arr[i]}' file

ここで、NRのarrインデックス(レコード番号、つまり行)がmainブロックに生成されます。ENDブロック内ではforループが機能します。

答え4

使用標準sed:

sed -n 'N;N;N;P' file

で読み取った行ごとにfile別の3行を読み、区切られた改行文字を使用して元の行に追加しますN。その後、コマンドはP最初の改行文字まで元の行を印刷します。

または:

sed -n 'p;n;n;n' file

これは似ていますが、最初に現在の行が印刷され、次に廃棄される他の3行が読み取られます。

関連情報