2013-04-22 7 views
6

Ich weiß, wie man mit awk und sed eine Reihe von Linien bekommt. Ich weiß auch, wie man jede n-te Zeile mit awk und sed ausdruckt.Wie kann ich im n-ten Intervall einen Zeilenbereich mit awk, sed oder einem anderen Unix-Befehl erhalten?

Allerdings weiß ich nicht, wie man die beiden kombiniert.

Zum Beispiel habe ich eine Datei mit 1780000 Zeilen.

Für jede 17800. Linie würde Ich mag 17800. line plus die zwei danach drucken. So

wenn ich eine Datei mit 1.780.000 Zeilen habe und es beginnt von 1 und endet bei 1.780.000, wird dieser Druck:

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

Wer weiß, wie eine Reihe von Linie awk mit jedem n-te Intervall zu erhalten, sed oder ein anderer Unix-Befehl?

Antwort

4

GNU Mit sed:

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

Bedeutung,

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

Wir können auch die ersten drei Zeilen hinzufügen:

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

Awk benutzen, das wäre einfacher:

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

Vielen Dank. Wenn ich also 100 Zeilen nach der n-ten Zeile drucken will, brauche ich 100 von N; oder gibt es einen leichteren Weg? –

+0

Ja, Sie brauchen 100 N, in diesem Fall ist awk klar der Weg. – perreal

+0

aber Sie können auch ein Skript verwenden, um das sed-Skript zu generieren – 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