2016-04-23 6 views
1

Ich weiß, wie es mit awk zu tun, zum Beispiel, halte Linien, die Nummer 3 in der zweiten Spalte enthält: $ awk ‚‚$ 2‘== 3‘grep: halte Linien nach Anzahl in bestimmten Spalte

Aber Wie mache ich das gleiche mit nur Grep? Wie wäre es mit der ersten Spalte?

+0

'grep"^muster "file' vielleicht? –

+0

Tnx, das funktioniert für 1. Spalte, was ist mit der 2. Spalte? –

+0

Haben Sie eine dritte Spalte oder die zweite Spalte die letzte? –

Antwort

2

Hier grep -P '^[^\t]*\t3\t' your_file aus den Kommentaren die längere Erklärung für meinen mysteriösen Befehl lautet:

ich davon ausgegangen, dass die Spaltenbegrenzer ein Register ist. grep ohne -P würde einige merkwürdige Dinge erfordern, um es direkt zu verwenden (siehe z.B. see here). Die -P ermöglicht es, einfach \t ohne Probleme zu schreiben. Wenn zum Beispiel Ihr Trennzeichen ; ist, dann können Sie das \t durch ; ersetzen und Sie brauchen die -P Option nicht.

Having said that, lässt die Idee hinter dem regulären Ausdruck erklären: Sie sagten, Sie 3 in der zweiten Spalte übereinstimmen soll:

  • ^ bedeutet: am Anfang der Zeile
  • [^\t]* bedeutet: Null oder mehr (*) Vorkommen von etwas, das nicht eine Lasche ([^\t] hier die ^ bedeutet „keine“)
  • von Reitern gefolgt
  • gefolgt von 3
  • von Reitern gefolgt

Jetzt haben wir effektiv die Idee zum Ausdruck gebracht, dass wir ein 3 wie der Inhalt der zweiten Spalte benötigen (\t3\t) und wir sind in dem genauen Inhalt der ersten Spalte nicht interessiert . Die ^[^\t]*\t ist nur notwendig, um die Idee "Was folgt in der zweiten Spalte ist" auszudrücken.

Wenn Sie etwas in der vierten Spalte anpassen möchten, können Sie dies verwenden, um die ersten drei Spalten zu überspringen und eine 4 in der vierten Spalte: ^([^\t]*\t){3}4. (Beachten Sie die Klammern und die {3}).

Wie Sie viele Details sehen können und awk ist viel eleganter und einfacher.

Sie können dies in der documentation of grep lesen und dann müssen Sie etwas über reguläre Expression, z. start here.

3

Grep ist nicht gut dafür, awk ist besser. Aber vorausgesetzt, Ihre Spalten sind durch Leerzeichen getrennt, dann möchten Sie

grep -E '^[^ ]+ +3(|$)' 

Erläuterung: etwas finden, das einen Start Linie, gefolgt von einem oder mehreren nicht-Leerzeichen (erste Spalte), dann ein oder mehrere Leerzeichen (Spaltentrennzeichen), dann die Zahl 3, dann entweder ein Leerzeichen (weil es eine andere Spalte gibt) oder ein Zeilenende (wenn es keine andere Spalte gibt).

(aktualisiert Syntax nach dem Test zu beheben.)

+0

IDK, wenn ich nur Ihren Code kopieren, funktioniert es nicht für mich, mybe Ich bin einfach zu dumm: P aber das funktioniert für mich: grep -P '^ [^ \ s] * \ s3 \ s ' –

+0

Bearbeitet, um die Syntax nach dem Testen zu korrigieren. – Mort

+1

Beachten Sie, dass '\ S' im Perl-Regex-Modus äquivalent zu' [^ \ s] 'sein sollte. Sie können auch '+' nicht '*' abhängig davon, ob eine Spalte leer sein kann. Ersteres ist "1 oder mehr" und letzteres ist "Null oder mehr". – Mort

Verwandte Themen