So suchen Sie eine Zeichenfolge ab der zweiten Spalte

400
user9371654

Ich habe eine Datei, die durch Kommas getrennte Zeichenfolgen enthält. Die Zeichenfolgen können Punkte enthalten (dh nicht nur alphanumerische Zeichen). Dies ist ein Beispiel:

site1.com,Level1.2 site2.com,Level1.1,Level1.0,Level1.2 site3.com,Level1.2 site4.com,Level1.2,Level1.1,Level1.0,Levelv3 siteLevel1.2,Levelv2 Level1.2,Levelv2 

Ich muss nach den Site-Namen suchen (bitte beachten Sie, dass ich kein bestimmtes Format für den Site-Namen habe, dh er endet nicht mit .com. Daher sollte ich mir nicht überlegen, wie die erste Spalte aussieht.)

Ich brauche die Sites, die NUR eine bestimmte Zeichenfolge enthalten. In diesem Beispiel Level1.2 ausschließlich (ohne Level1.1 noch Level1.0 nicht Level3 entweder vor oder nach ). Drucken Sie dann das Ergebnis in einer neuen Datei, die der Bedingung entspricht (enthält nur Stufe 1.2). Die Schlüsselwörter für die Suche beginnen also in der zweiten Spalte (ich möchte nicht, dass Suchergebnisse gefunden werden, die ein übereinstimmendes Muster im Websitenamen finden).

Wenn ich also nach Level1.2 suche, sollte die neue Datei Folgendes enthalten:

site1.com,Level1.2 site3.com,Level1.2 

Aber mein Befehl resultiert in:

site1.com,Level1.2 site3.com,Level1.2 siteLevel1.2,Levelv2 Level1.2,Levelv2 

Wenn es eine Site gibt, deren Name Level1.2 enthält, sollte sie nicht gezählt werden, da mir die erste Spalte nicht wichtig ist.

Ich habe diesen Befehl ausprobiert und es funktioniert für mich. Die einzige Sache ist, dass ich die Suche brauche, um das Vorkommen der Suchzeichenfolge in der ersten Spalte zu ignorieren.

awk '/Level1.2/ && !/Level1.1/ && !/Level1.0/ !/Level3/' myfile.txt > result.txt 
0
Kannst du nicht einfach "grep" Level1.2 $ "myfile.txt" machen? Arkadiusz Drabczyk vor 5 Jahren 0
Wozu dient das "$"? und mit grep, wenn es in einer Zeile mit anderen Levels gefunden wird: Level1.1, möchte ich nicht, dass es zählt. Ich möchte es zählen, wenn es der einzige in der Zeile (nach dem Namen der Site) ohne andere ist. user9371654 vor 5 Jahren 0
"$" bedeutet Zeilenende. Wie wäre es mit: `grep -E '^ site [0-9] + \. Com, Level1.2 $' myfile.txt`? Arkadiusz Drabczyk vor 5 Jahren 0
Das Zeilenende bedeutet jedoch nicht, dass Lev1.2 der einzige in der Zeile ist. Es können andere vorausgehen. In diesem Fall will ich es nicht. Ich möchte sicherstellen, dass Level1.2 der einzige ist, der von Spalte2 an weitergeht. dh ich muss das Auftreten einer anderen Ebene nach column2 ausschließen. user9371654 vor 5 Jahren 0
Versuchen Sie den zweiten "grep" -Befehl, den ich gepostet habe. Arkadiusz Drabczyk vor 5 Jahren 0
Entschuldigung, es tut nicht den Zweck. Die erste Spalte hat kein festes Format. Ich kann "^ site [0-9] + \. Com" nicht verwenden. Mein Befehl ist korrekt, zeigen Sie mir bitte, wie Sie ab der zweiten Spalte suchen, wenn Sie wissen. Vielen Dank. user9371654 vor 5 Jahren 0

2 Antworten auf die Frage

0
oliv

Sie können dies versuchen awk:

awk -F, '$2=="Level1.2" && NF==2' myfile.txt 

Der Eingabebegrenzer ist auf gesetzt ,. Der Befehl druckt Zeilen mit 2 Feldern, wobei das zweite Feld die passende Zeichenfolge enthält.

Ich muss meinen Befehl verwenden. Ich habe jetzt einen Tippfehler korrigiert. Der Zweck besteht darin, andere Zeichenfolgen auszuschließen. Ich muss nur mit der Suche von der zweiten Spalte beginnen (in durch Kommas getrennten Spalten, dh nach dem ersten Komma), da die Suchzeichenfolge (Level1.2 in der ersten Spalte vorkommen kann und mir die erste Spalte egal ist). Kannst du mir dabei helfen? user9371654 vor 5 Jahren 0
@ user9371654 Aktualisieren Sie Ihre Frage mit einem Beispiel, das alle möglichen Fälle enthält, die Sie ansprechen möchten. oliv vor 5 Jahren 0
aktualisierte. Bitte helfen Sie mir, wie Sie mit der Suche in der zweiten Spalte beginnen (dh ich möchte das Vorkommen der Suchzeichenfolge in der ersten Spalte ignorieren). user9371654 vor 5 Jahren 0
Selbst wenn Sie eine andere Lösung haben, fühle ich mich mit meinem Muster so wohl, wie ich es verstehe. Sie müssen nur wissen, wie Sie in der zweiten Spalte suchen. user9371654 vor 5 Jahren 0
@ user9371654 Mein Skript funktioniert immer noch mit Ihrem aktualisierten Beispiel ... oliv vor 5 Jahren 0
0
AFH

Die folgenden Arbeiten:

grep '^[^,]*,Level1\.2' myfile.txt | grep -v ',Level.*Level' 

Dies überspringt das erste Feld und das nachfolgende Komma und sucht dann nach einer Übereinstimmung mit Level1.2; Das Ergebnis wird dann gefiltert, indem alle Datensätze mit einem nachfolgenden ignoriert werden Level( Levelim ersten Feld wird kein vorangestelltes Komma angezeigt).

Ich bin davon ausgegangen, dass anderer Text angehängt werden kann Level1.2, sofern er keine LevelZeichenfolge enthält. Wenn dies nicht der Fall ist, können Sie die einfachere Methode verwenden:

grep '^[^,]*,Level1\.2$' myfile.txt 
(Meine Antwort wurde mit Ihrer Annahme der Antwort von Oliv gekreuzt, aber ich lasse es, da sie einen alternativen Ansatz bietet und möglicherweise anpassungsfähiger für verwandte Suchprobleme ist.) AFH vor 5 Jahren 0