多くのログテキスト出力を生成するbashコマンドパイプラインがあります。ただし、ほとんどの場合、前の行を繰り返すので、デフォルトの出力データはタイムスタンプといくつかのマイナーなフラグを除いて数時間に一度だけ変更されます。将来の処理/研究のために、この出力をテキストファイルとして保存する必要があります。各Xの最初の行だけを印刷するには、どのようにパイプする必要がありますか?
答え1
最初の行を印刷し、N行ごとに次のN-1行をスキップします。
awk -v N=100 'NR%N==1' infile
テスト:
$ seq 1000 |awk -v N=100 'NR%N==1'
1
101
201
301
401
....
スキップしたい行数を渡すために、パラメータからその数を読み取ることもできます。
$ seq 1000 |awk -v Num=100 -v Skip=98 '(NR-1)%Num<Num-Skip'
1
2
101
102
201
202
301
302
401
402
501
502
601
602
701
702
801
802
901
902
答え2
@αГsнιιはすでに要求されたタスク(特定の行をスキップする)を実行する方法を示しましたが、代わりに「タイムスタンプといくつかのマイナーなフラグ」だけが他の後続の行を印刷する方が良いと思います。スキップされた行数です。それでは、これらの「タイムスタンプといくつかのマイナーなフラグ」がフィールド3、6、8、17に格納されている場合はどうすればよいですか?
awk '
{
origRec = $0
$3=$6=$8=$17=""
currKey = $0
}
currKey != prevKey {
print origRec
prevKey = currKey
}
' file
上記の内容を簡単に調整して、類似した各グループの最初の行だけでなく最後の行も印刷できるため、最初と最後のタイムスタンプ(有用な場合)を表示したり、複数の類似したグループの印刷数を追加したりできます。 。スキップする行。
答え3
GNUの使用split
:
$ split -n r/1/100 input
seq
または、テストには次のものを使用できますjot
。
$ jot 500 | split -n r/1/100
$ seq 500 | split -n r/1/100
## 1
## 101
## 201
## 301
## 401
~から
coreutils
:
r/k/n 同じですが出力のみ可能K最初N標準出力へ
-n r/1/100
100行のうち、最初の行だけが印刷されます。
-n r/2/100
100行ごとに2行目も印刷されます。
他には何もしなかった少しコマンドが変更されました。回答。
そしてperl
:
$ perl -ne 'print if $_ % 100 == 1' input
これは、後述のものと同様のPerlコマンドです。この回答。
答え4
seq 1000| awk -v x=1 'NR==x{print ; x=NR+100}'
出力
1
101
201
301
401
501
601
701
801
901