ファイルを整理するのに役立つ人はいますか? 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
何もしないので、awk
3行をスキップしました。
他の用途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行が読み取られます。