大容量ファイルがあり、連続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