2013-04-22 5 views
6

私はawkとsedを使ってある範囲の行を得る方法を知っています。 awkとsedを使ってn行目ごとにプリントアウトする方法も知っています。awk、sed、または他のunixコマンドを使用して、n番目の間隔ごとにどの範囲の行を得ることができますか?

しかし、私はどのように2つを組み合わせるか分かりません。

たとえば、1780000行のファイルがあります。

17800行ごとに、17800行目とそれ以降の2行を印刷したいと思います。

私は178万ラインでファイルを持っており、それは1から始まり、178万で終わるのであれば、これは印刷されます:

1 
2 
3 
17800 
17801 
17802 
35600 
35601 
35602 
# ... and so on. 

はawkを使用して線の範囲ごとに、n番目の間隔を取得する方法を誰もが知っています、 sed、または他のunixコマンド? GNUを使用して

答えて

4

はsedを:

sed -n '0~17800{N;N;p}' input 

意味、

For every 17800th line: 0~17800 
    Read two lines: {N;N; 
    And print these out: p} 

我々はまた、最初の3行を追加することができます:Awkのを使用して

sed -n -e '1,3p' -e '0~17800{N;N;p}' input 

を、これは単純に次のようになります。

awk 'NR%17800<3 || NR==3 {print}' input 
+0

ありがとうございました。だから、もしn行目の後に100行を印刷したいのであれば、100個のNが必要です。それとも簡単な方法がありますか? –

+0

はい、あなたは100個のNを必要とします。その場合、awkははっきりと行く方法です。 – perreal

+0

でもスクリプトを使ってsedスクリプトを生成することができます – perreal

2
$ cat file 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

$ awk '!(NR%3)' file 
3 
6 
9 

$ awk -v intvl=3 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
3 
4 
----- 
6 
7 
----- 
9 
10 

$ awk -v intvl=4 -v delta=2 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
4 
5 
----- 
8 
9 

$ awk -v intvl=4 -v delta=3 '!(NR%intvl){print "-----"; c=delta} c&&c--' file 
----- 
4 
5 
6 
----- 
8 
9 
10 
関連する問題