50行ごとに15行目と25行目を印刷するにはどうすればよいですか?

50行ごとに15行目と25行目を印刷するにはどうすればよいですか?

大容量ファイルがあり、連続50行ごとに印刷したいと思います。15日そして25日ワイヤー。

sed -n '15,25p' inputfile

15行と25行のみを印刷し、ファイルの50行ごとに繰り返すようにこのコマンドを変更するにはどうすればよいですか?

答え1

awk 'NR % 50 == 15 || NR % 50 == 25'

明らかに携帯可能です。

GNUのsed代替案を参照してください。

sed '15~50b;25~50b;d'

anyを使用すると、sedいつでも次のことができます。

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

(次の行を14回取得し、次の行を10回印刷し、次の行を25回印刷して、次のループに戻ります(不足している追加の行をつかんで50回生成します))。

答え2

これは仕事です。awk

awk '(NR%50==15) || (NR%50==25)' inputfile

編集:OPのsedディレクティブに誤解がありました。

答え3

そしてperl

1)解決策と同様に、変数は行awk番号$.を格納します。

$ seq 135 | perl -ne 'print if $.%50==15 || $.%50==25'
15
25
65
75
115
125

2)行番号リストを比較して拡張を容易にします。

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25)'
15
25
65
75
115
125

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25,32)'
15
25
32
65
75
82
115
125
132

答え4

awkを使用する別の方法は、次のものに基づいています。サンディップの考えリストの使い方:

awk 'BEGIN { a[15] a[25] }; NR % 50 in a'

a印刷する行に基づいて配列のキーを設定します。NR % 50配列のキーの1つと一致する行を印刷します。


userいくつかのパフォーマンス指標を提供するために、このアプローチの時間を測定し、3つの実行時間の平均を求めて他の答えと比較しました。

0.276秒

$ time awk 'BEGIN { a[15] a[25] }; NR % 50 in a' <(seq 1000000) > /dev/null

0.374秒

$ time awk 'NR % 50 == 15 || NR % 50 == 25' <(seq 1000000) > /dev/null

0.384秒

$ time perl -ne 'print if $.%50==15 || $.%50==25' <(seq 1000000) > /dev/null

0.542秒

$ time perl -ne 'print if grep {$_==$.%50} (15,25)' <(seq 1000000) > /dev/null

関連情報