2016-05-26 9 views
0

Ich versuche, alle 2,4,8,16 usw. Zeilen einer Datei mit vielen Zeilen und vielen Spalten zu drucken.Drucken Zeilen Nummer 2, 4, 8, 16 ... mit awk

Dies ist, was ich versucht:

awk 'BEGIN {N = 2} 
{ 
    {if (NR == N) {print; }} 
    N = N*2 
}' infile > outfile 

ist jedoch nichts an den outfile geschrieben werden. Was fehlt mir?

Hier sind die Inhalte einer Probe infile:

1 10 
2 20 
3 30 
4 40 
5 50 
6 60 
7 70 
8 80 
9 90 
10 100 

Die erwartete Ausgabe

2 20 
4 40 
8 80 

Eine Datei namens outfile erstellt, aber in es mit nichts.

+0

Sie sind die Grundlagen der Sprache awk fehlt. Lesen Sie das Buch Effective Awk Programming, 4. Auflage, von Arnold Robbins. Allerdings sollten Sie wahrscheinlich eine Ausgabe sehen, aber wenn Sie keine [mcve] einschließlich prägnanter, testbarer Beispieleingabe und erwarteter Ausgabe veröffentlichen, können wir Ihnen nicht helfen. –

+1

Ich habe ein Beispiel hinzugefügt. Außerdem habe ich jetzt nicht die Zeit, ein ganzes Buch zu lesen. Ich versuche, durch Beispiele im Web zu lernen, und ich sehe nichts falsch daran. – gforce89

+0

Wenn Sie die Sprache oder das Paradigma nicht kennen, woher wissen Sie dann, welche Beispiele Sie im Internet finden, um daraus zu lernen? Meine Erfahrung ist, dass die meisten Online-Beispiele weit weg von der Basis sind und ich werde viele schlechte Gewohnheiten sehr schnell lernen und dann Jahre damit verbringen, zu stolpern und sie dann zu lernen, bevor ich lerne, wie man awk richtig benutzt das Buch aber YMMV Ich nehme so viel Glück! –

Antwort

2

Sie Ihre N für jeden Datensatz zu verdoppeln, aber nur etwas drucken, wenn NNR – gleich, die nie ist:

Line  Value of N 
1  2 
2  4 
3  8 
... 

es zu beheben, müssen Sie die Verdoppelung der N so dass es nur bewegen passiert, wenn NR == N gilt:

awk -v n=2 'NR == n { print; n *= 2 }' 

zog ich habe außerhalb des Programms den Anfangswert zuweisen verwendet, einen Klein n wegen der persönlichen Vorlieben, und bereinigt das Innere des Programms: Wenn die Bedingung NR == n wahr ist, dann drucken Sie den Datensatz und doppelt n.

Laufen auf dem Probeneingang:

$ awk -v n=2 'NR==n {print; n *= 2}' infile 
2 20 
4 40 
8 80