大きなファイルがあり、15行目と25行目から順に50行ずつ印刷したいと考えています。
sed -n '15,25p' inputfile
このコマンドを変更して、15行目と25行目だけを印刷し、ファイル内の50行ごとにループする方法。
大きなファイルがあり、15行目と25行目から順に50行ずつ印刷したいと考えています。
sed -n '15,25p' inputfile
このコマンドを変更して、15行目と25行目だけを印刷し、ファイル内の50行ごとにループする方法。
回答:
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にします))。
と 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
リストを使用するというSundeepのアイデアに基づく、awkを使用した別のアプローチ:
awk 'BEGIN { a[15] a[25] }; NR % 50 in a'
a印刷する行に基づいて配列にキーを設定します。NR % 50配列のキーの1つに一致する行を出力します。
パフォーマンスをある程度示すために、私はこのアプローチの時間を計り、他の回答と比較して、user3回の実行の平均時間を取った。
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