2017-04-12 4 views
3

Wie alle Zeilen gedruckt werden, wenn bestimmte Bedingungen übereinstimmen.den gesamten Inhalt der Variablen drucken, wenn die Anzahl der Zeilen größer ist als N

Beispiel:

echo "$ip" 
this is a sample line 
another line 
one more 
last one 

Wenn diese Datei dann mehr als 3 Zeilen hat die ganze Variable drucken.

I am tried: 

echo $ip| awk 'NR==4' 
last one 
echo $ip|awk 'NR>3{print}' 
last one 

echo $ip|awk 'NR==12{} {print}' 
this is a sample line 
another line 
one more 
last one 

echo $ip| awk 'END{x=NR} x>4{print}' 

Notwendigkeit, dies zu erreichen:

Wenn diese Datei mehr als 3 Zeilen hat dann die gesamte Datei drucken. Ich kann dies mit wc und bash tun, aber brauche eine Einlage.

Antwort

2

Sie Awk verwenden können, wie folgt,

echo "$ip" | awk '{a[$0]; next}END{ if (NR>3) { for(i in a) print i }}' 
one more 
another line 
this is a sample line 
last one 

Sie auch den Wert 3 konfigurierbar von einer awk Variable machen,

echo "$ip" | awk -v count=3 '{a[$0]; next}END{ if (NR>count) { for(i in a) print i }}' 

Die Idee, den Inhalt der jeder Zeile zu speichern, ist in {a[$0]; next} Wenn jede Zeile verarbeitet wird, wird die END-Klausel bei Erreichen der NR-Variable die Zeilenanzahl der Zeichenfolge/Datei haben, die Sie haben. Drucken Sie die Zeilen, wenn die Bedingung übereinstimmt, d. H. Anzahl der Zeilen größer als3 oder welcher konfigurierbare Wert auch immer verwendet wird.

Und denken Sie immer daran, die Variablen in bash doppelt zu zitieren, um zu vermeiden, Worttrennung von der Shell durchgeführt werden.


Mit James Brown's nützlichen Kommentar unten die Reihenfolge der Linien zu erhalten, tun

echo "$ip" | awk -v count=3 '{a[NR]=$0; next}END{if(NR>3)for(i=1;i<=NR;i++)print a[i]}' 
this is a sample line 
another line 
one more 
last one 
+1

Sie sind eine freundliche Person, die anderen helfen. Vielen Dank. – monk

+2

Das 'für (i in a)' produziert nicht die Ausgabe in der ursprünglichen Reihenfolge aber in einer zufälligen Reihenfolge ([sehen Sie mich] (https://www.gnu.org/software/gawk/manual/html_node/Controlling-Array -Traversal.html # Steuern-Array-Traversal)). Eher '{a [NR] = $ 1} END {if (NR> 3) für (i = 1; i <= NR; i ++) drucke ...}'. –

+1

@JamesBrown: Aktualisiert! Vielen Dank! – Inian

1

Eine weitere in awk. Erste Testdateien:

$ cat 3 
1 
2 
3 
$ cat 4 
1 
2 
3 
4 

Code:

$ awk 'NR<4{b=b (NR==1?"":ORS)$0;next} b{print b;b=""}1' 3 # look ma, no lines 
    [this line left intentionally blank. no wait!] 
$ awk 'NR<4{b=b (NR==1?"":ORS)$0;next} b{print b;b=""}1' 4 
1 
2 
3 
4 

Erklärt:

NR<4 {      # for tghe first 3 records 
    b=b (NR==1?"":ORS) $0 # buffer them to b with ORS delimiter 
    next     # proceed to next record 
} 
b {      # if buffer has records, ie. NR>=4 
    print b    # output buffer 
    b=""     # and reset it 
}1       # print all records after that 
3

Der richtige Weg, um diese (kein Echo, kein Rohr, keine Schleifen, etc.) zu tun:

$ awk -v ip="$ip" 'BEGIN{if (gsub(RS,"&",ip)>2) print ip}' 
this is a sample line 
another line 
one more 
last one 
+1

Wenn Sie nur _ahead_ von mir antworten, 80% meiner "awk" Antworten würden nicht akzeptiert;) – Inian

+3

:-). Ehrlich gesagt verstehe ich einfach nicht, warum die Leute bei der ersten Antwort, die sie bekommen, springen, anstatt Zeit zu geben, um zu sehen, welche anderen Antworten sie bekommen. Du würdest überrascht sein, wie oft (diesmal nicht) ich eine akzeptierte Antwort ansehe und denke "Heiliger Mist - es gibt eine Zeitbombe!"Aber ich kann meine Zeit nicht damit verschwenden, Kommentare und/oder zusätzliche Antworten jedes Mal zu verschicken (es sei denn, es ist so trivial wie dieses), da mein Gefühl nach der Annahme einer Antwort gewöhnlich weiter geht und andere es in Zukunft normalerweise sehen werden gehe davon aus, dass die angenommene Antwort die ist, die sie auch annehmen sollten. –

Verwandte Themen