各50行のうち15行目と25行目を印刷する方法は?


9

大きなファイルがあり、1525から順に50行ずつ印刷したいと考えています。

sed -n '15,25p' inputfile

このコマンドを変更して、15行目と25行目だけを印刷し、ファイル内の50行ごとにループする方法。

回答:


22
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にします))。


10

これはの仕事です awk

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

編集:OPのsed命令で誤解しました。


9

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

リストを使用するという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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.