Ich möchte die Zeilen zwischen "X" zählen. Dies ist nur ein Beispiel. Ich muss den Code auf ein komplexes biologisches Ergebnis anwenden. Ich bin dankbar , wenn Sie einen Befehl vorschlagen kann, vorzugsweise unter Verwendung von awk
, grep
oder sed
wie ich bin mit denen.
Beispiel:
X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X
Gewünschte Ausgabe:
3
4
1
Antworten:
Mit
awk
:Erhöhen Sie die Anzahl für jede Zeile, die nicht enthält
X
. Drucke und setze die Anzahl der Zeilen zurück, die enthaltenX
.quelle
X
, würde die erste Anzahl von Zeilen mit dieser Lösung immer noch gezählt und ausgegeben, bis die erste Zeile mitX
übereinstimmt. EX (Es können keine neuen Zeilen in den Kommentaren hinzugefügt werden, es muss jedoch eine neue Zeile zwischen den einzelnen Zeichen stehen. P):Y X Y Y X Y Y Y
würde Folgendes ausgeben:1 2
END{if (count)print count}
) und Leerzeile produziert , wobei X in Start war zu vermeiden , die Sie hinzufügen können/X/&&count
auch in ZustandY
s nicht gezählt werden sollten, da sie nicht genau zwischen zweiX
s liegen. der andere beklagt, dass abschließendeY
s nicht gezählt werden, weil sie nicht genau zwischen zweiX
s liegen. Ich werde warten, bis das OP geklärt ist, falls erforderlich. Mir geht es gut mit dieser Antwort, wie es bis dahin ist.Wie es funktioniert:
Awk liest implizit die Eingabedateien Zeile für Zeile durch.
/X/ && prev{print NR-prev-1}
Für jede Zeile, die enthält
X
und der wir zuvor einen Wert zugewiesen habenprev
, drucken Sie die Nummer der aktuellen Zeile ausNR
, minusprev
minus eins./X/{prev=NR}
X
Setzen Sie für jede Zeile, die enthält , die Variableprev
auf die aktuelle ZeilennummerNR
.quelle
NR
bringt mich auf eine Idee:awk '/X/{print NR - 1; NR = 0}' foo
X
, gibt es einen kleinen Unterschied in der Ausgabe zwischen den beiden Antworten, wie ich in einem Kommentar unter der Antwort von muru erklärt habe.Ein weiterer einfacher
awk
Ansatz, der mit den Beispieldaten von OP funktioniert und bei demX
es sich nicht um das erste oder sogar das letzte oder wiederholte X handelt.Oben ist richtig, wenn in jeder Zeile nur ein Feld mit Standard-FS- Leerzeichen vorhanden ist. Andernfalls wird unten im Allgemeinen die Zeilenweise- Zählung überarbeitet . Sie können dort Ihr MUSTER anstelle von X eingeben .
Beispieleingabe:
Die Ausgabe ist:
quelle
Die meisten Antworten hier stimmen mit dem Inhalt der zu zählenden Zeile überein, wobei reguläre Ausdrücke verwendet werden, die in das Awk-Programm eingebettet sind. Wenn Sie Zeilen mit Inhalten abgleichen müssen, die Sonderzeichen enthalten (entweder mit Awk oder regulären Ausdrücken), ist es besser, Zeichenfolgen tatsächlich auf Gleichheit zu vergleichen. Deshalb schlage ich das folgende Awk-Skript als Variante von Murus Antwort vor :
Speichern Sie es zB als Textdatei
count-rows.awk
und rufen Sie es wie folgt auf:Sie können den Wert
needle
nach Ihren Wünschen anpassen . Der Vorteil dieser Methode ist, dass Sie das Programm aus einem Shell-Skript mit einem beliebigen Wert aufrufen können,needle
ohne Probleme zu umgehen:quelle