100行のうち99行をスキップ

100行のうち99行をスキップ

多くのログテキスト出力を生成する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/100100行のうち、最初の行だけが印刷されます。
-n r/2/100100行ごとに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

関連情報