2016-07-12 7 views
1

übereinstimmen Wenn ich das dritte Feld eine Zeile mit einem bestimmten Muster in einem Bereich, beispielsweise entfernen möchten, könnte ich schreiben:eine Linie, wenn alle Felder ein bestimmtes Muster

awk '$3!='pattern' file 

Wenn ich will, entfernen Zeilen, in denen alle Felder einem bestimmten Muster entsprechen, wie könnte ich das tun? Hier ist ein Beispiel-Datei:

number1 1245 1/2 1/2 1/2 1/2 
number2 1468 1/1 1/2 2/2 1/2 

ich die erste Zeile in diesem Fall entfernen möchten, da alle Felder nach dem zweiten Feld 1/2 ohne Ausnahme enthalten.

Danke.

+1

konnte sed 'sed‚/^\ (1 \/2 Verwenden Sie [[: space:]] * \) \ + $/d'' – 123

+0

Danke. Es klappt. Ich musste meine ursprüngliche Dateistruktur in der Frage wie in meiner tatsächlichen Datei ändern, ich habe mehrere Spalten vor denjenigen, die das Muster haben können. Wie auch immer, ich werde es zum Laufen bringen. – Homap

Antwort

2

Verwenden von Sed

sed '\`^\([^[:space:]]\+[[:space:]]\+\)\{2\}\(1/2[[:space:]]\+\)\+1/2[[:space:]]*$`d' file 

mit -r/-E flag

sed -r '\`^([^[:space:]]+[[:space:]]+){2}(1/2[[:space:]]+)+1/2[[:space:]]*$`d' file 

nur Leerzeichen Unter der Annahme verwendet werden, und nicht auf andere Leerzeichen.

sed -r '\`^([^ ]+ +){2}(1/2 +)+1/2 *$`d' file 

Mit awk

awk '{for(i=3;i<=NF;i++)if($i!="1/2")next;print}' file 

Drucke

number2 1468 1/1 1/2 2/2 1/2 
1

Verwenden sed für einfache zeilenorientierte Bearbeitung wie folgt aus:

$ sed '/pattern/d' input 

In diesem Fall möchten Sie alle Zeile entfernen, die vier aufeinanderfolgende Vorkommen von „<space>1/2“ am Ende der Zeile hat:

$ sed '/\(1\/2\)\{4\}$/d' input 

Alternativ

$ sed -E '/(1\/2){4}$/d' input 

(wenn Sie GNU haben sed, verwenden Sie -r anstelle von -E. Ich bin auf einem BSD-System und Verwendung BSD sed)

UPDATE: Dank @EdMorton zur Kommentierung, dass Sie von dem etwas hässlich \/ im Muster in der folgenden Art und Weise loswerden können:

$ sed '\:\(1/2\)\{4\}$:d' input 

oder

$ sed -E '\:(1/2){4}$:d' input 

dass in diesem Fall nicht viel kann, aber sicher die ganze Sache Skripte viel einfacher zu lesen in komplizierteren sed Bearbeitung macht.

+0

außer ohne Anker muss es nur 1/2 auf dem letzten enthalten, könnte 1/24 sein – 123

+0

@ 123 Korrekt. Antwort aktualisiert – Kusalananda

+1

@EdMorton Danke für die '-E' Info. Es ist jedoch nur der Befehl "s", der alternative Begrenzer verwendet. 'sed ': Muster: d'' wird leider nicht wok. – Kusalananda

0
$ awk '{delete cnt; for (i=3;i<=NF;i++) cnt[$i]++} cnt["1/2"] < length(cnt)' file 
number2 1468 1/1 1/2 2/2 1/2 
Verwandte Themen