2012-04-01 6 views
11

Ich habe eine sehr große Datei, in der ich jede n-te Zeile erhalten und in eine Zeile drucken muss.Drucken Sie jede n-te Zeile in eine Zeile mit gawk

Meine Daten:

1  937 4.320194 
2  667 4.913314 
3  934 1.783326 
4  940 -0.299312 
5  939 2.309559 
6  936 3.229496 
7  611 -1.41808 
8  608 -1.154019 
9  606 2.159683 
10  549 0.767828 

Ich möchte, dass meine Daten wie folgt aussehen:

1  937 4.320194 
3  934 1.783326 
5  939 2.309559 
7  611 -1.41808 
9  606 2.159683 

Dies ist ein Beispiel ist natürlich, möchte ich jede 10. Zeile für meine riesige Datendatei. Ich habe versucht, diese so weit:

NF == 6 { 
    if(NR%10) {print;} 
    } 

Antwort

33

jede zweite Zeile, beginnend mit dem ersten Druck:

awk 'NR%2==1' file.txt 

jede zehnte Zeile zu drucken, mit der zehnten Zeile beginnen:

awk 'NR%10==0' file.txt 

Um dies zu verwenden, in einem Skript Fügen Sie zu einer Datei mit dem Namen script.awk:

BEGIN { 
    print "Processing file" 
} 

NR%10==0 

END { 
    print "Finished processing" 
} 
hinzu

Dann führen:

awk -f script.awk file.txt 
+0

Sollte das nicht "awk" NR% 10 == 0 'file.txt' sein? –

+0

@ D.Shawley Ja, Sie haben Recht. Ich sollte die Dinge wirklich durchlesen, bevor ich antworte! Prost! – Steve

+0

Vielen Dank, ich weiß, es war eine einfache Frage, aber ich konnte es nicht für das Leben von mir herausfinden. – user1269741

2

Es ist nicht (g) awk, aber es wird funktionieren:

cat myfile | grep ^[[:digit:]]*0[[:blank:]] sollte es tun.

9

Stück des Kuchens: cat test.txt | awk 'NR % 10 == 1'

+1

+1 trotz des Missbrauchs von 'Katze'. :) – sarnold

+0

Das druckt die Zeile nach jeder 10. Zeile - Zeilen 1, 11, 21, 31, etc. Sie wollen Zeilen, wo der Modul ist Null statt 1. –

+2

Nun, warum? Dadurch wird auch jede zehnte Zeile gedruckt, beginnend mit der ersten, und sie entspricht dem Beispiel. –

10

Mit sed, Sie viele Variationen dieses ganz einfach mit dem Befehl first~step tun können. Zum Beispiel:

# Odd lines 
sed -n 1~2p file 
# Every tenth line (10, 20, 30, ...) 
sed -n 10~10p file 
# Every tenth line (1, 11, 21, ...) 
sed -n 1~10p file 
# First plus every tenth (1, 10, 20, 30, ...) 
sed -n -e 1p -e 10~10p file 
+0

sehr nette Verwendung von 'sed' hier +1! – Steve

+0

unter Mac OS X bekomme ich 'ungültigen Befehlscode ~'. Irgendeine Idee warum? – Gerard

+1

@Gerard Siehe: https://stackoverflow.com/questions/30003570/how-to-use-gnu-sed-on-mac-os-x – arielf