2016-09-09 1 views
-1

Ich habe eine Datei, wie unten -Unix-Linie zählen Befehl


Printed sometext
Gewünscht etwas else1
etwas Gewünscht else2
etwas Gewünscht else3
sometext Gedruckt
Gewünscht etwas else4
Gewünscht etwas anderes5
Gedruckt sometext
Angefordert etwas anderes6
etwas Gewünscht else7
etwas Gewünscht else8
etwas Gewünscht else9


ich die unten Ausgang benötigen -

Printed sometext 
3 
Printed sometext 
2 
Printed sometext 
4 

Könnte mir jemand mitteilen, wie können wir das erreichen?

+1

werfen Sie einen Blick auf 'awk' (Beispiel hier http://unix.stackexchange.com/questions/265210/count-all-lines-between-a-limiter) – Garf365

+0

Ich * nehme an * Sie fragen, wie man zählt die Linien zwischen einer festen Zeichenkette, die jede Zeile druckt, die genau dieser festen Zeichenkette entspricht, die alle anderen Ausgaben unterdrückt und sie durch die Anzahl der unterdrückten Zeilen ersetzt. Aber das ist überhaupt nicht klar aus der Frage. Obwohl es wünschenswert und oft notwendig ist, ein Beispiel für die von Ihnen gewünschte Ausgabe zu geben, ist dies kein Ersatz dafür, dass Sie tatsächlich erklären, was Sie zu tun versuchen. –

Antwort

1
awk '/line/{ print NR; exit }' input-file 

Der obige Befehl gibt die Zeilennummern des Auftretens der Zeichenfolgelinie in der Eingabedatei an. Jetzt können Sie die Zeilennummern mit dem Separator Text bekommen und Subtrahieren sie in geeigneter Weise gibt Ihnen Anzahl der Zeilen

edit: Funktioniert nur, wenn der Separator Text nicht Teil irgendeiner anderer Linie anders als die Trennlinien ist

1

Verwenden Sie nl {filename}. erste Verwendung cat und pipe bis nl. nl nimmt auch Datei als Eingabe.

Für z.B. cat pgadmin.log | nl wird so etwas anzeigen.

... 
    ... 
    120 ERROR : 11:46:32 AM: ERROR: column reference "created_at" is ambiguous 
    121 LINE 10: created_at as "Lead Creation Date", 
    ... 
    ... 

Weitere Informationen finden Sie unter man nl auf Unix-Plattform.

1

Angenommen, Ihre Eingabe in der Datei 1.txt und Sie müssen alle Zeilen außer spezifischen (wie in Ihrem Beispiel) zählen, dann können Sie verwenden:

cat 1.txt | awk '{if ($0 == "Printed sometext") { if (count>0) print count; print $0; count = 0; } else { count++;} } END { if (count>0) print count;}' 

Es erzeugt eine Ausgabe, wie Sie für Ihre benötigen Testdaten.

+1

Dies ist nicht ganz idiomatische awk. Typischer wäre "awk"/^ Printed sometext $/{if (l) print l; drucken; l = 0; next} {l ++} END {print l} 'input' (vermeide die UUOC und verwende ein Muster und keine if-Anweisung in einer Aktion). –

+0

Danke @WilliamPursell! Ich bin leider zu sehr an UUOC gewöhnt –

Verwandte Themen