2016-09-27 4 views
1

ich mit vier Spaltenentfernen Zeilen in zwei Spalten doppelten Wert haben

eine Datei haben
3022751,6656,7656,T029957 
3022751,6054,7054,T029957 
3022751,10400,10400,T029958 
3022751,10400,10400,T029958 

Ich möchte die Zeilen entfernen, die Duplikate in der Spalte 2 und 3. So meine erwartete Ausgabe haben, ist wie diese

3022751,6656,7656,T029957 
3022751,6054,7054,T029957 

Mein dieses awk Skript funktioniert gut, aber nicht die doppelte Reihe wie dieser

awk '!x[$2,$3]++' FS="," 

Stromausgang zu löschen ist

3022751,6656,7656,T029957 
3022751,6054,7054,T029957 
3022751,10400,10400,T029958 

Danke.

+0

Warum sollten Sie denken, '! X [$ 2, $ 3] ++' würde Zeilen entfernen, wo $ 2 == $ 3? –

+0

Sie wollen Zeilen löschen, in denen Felder zwei und drei gleich sind oder alle Zeilen mit demselben Wert in Spalte zwei einer anderen Zeile (und das gleiche für Spalte drei) zu beseitigen ??? Wenn Sie exponiert sind, gelten beide Regeln. –

Antwort

2
awk -F, '$2!=$3' file 

Lesen Sie das Buch Effektive Awk-Programmierung, 4. Ausgabe, von Arnold Robbins.

+1

Danke für die Hilfe, Ed. – pali

+1

Sie, wieder willkommen. Bitte beachten Sie http://stackoverflow.com/help/someone-answers –

0

mit grep

$ cat ip.txt 
3022751,6656,7656,T029957 
3022751,6054,7054,T029957 
3022751,10400,10400,T029958 
3022751,10400,10400,T029958 

$ grep -vE '^[^,]+,([^,]+),\1' ip.txt 
3022751,6656,7656,T029957 
3022751,6054,7054,T029957 
  • ^[^,]+, ersten Spalte und ,
  • ([^,]+) capture zweiten Spalte
  • \1 Rückverweis der erfassten Gruppe
  • so, wenn eine solche Übereinstimmung gefunden wird, dies nicht tun Drucken Sie die Linie, mit freundlicher Genehmigung -v Option
+1

Dies könnte mehr Zeilen als beabsichtigt entfernen, wenn sich die Art der vierten Spalte ändern würde. – potong

+0

@potong, true - meine Antwort ist absolut spezifisch für die gegebene Eingabe und die erforderliche Verarbeitung ... man kann die Regex möglicherweise anpassen oder die '-P'-Option für Lookahead/Lookbehind-Konstrukte für andere Fälle verwenden. 'Awk/perl' wird besser sein in generischen Fällen .. – Sundeep

+0

@potong, bei der weiteren Analyse, gefunden, dass meine früheren Regex Linien entfernen würde, wo 3. und 4. Spalte waren genauso gut .. so jetzt geändert, um nur auf 2. und 3. Spalte übereinstimmen .. danke :) – Sundeep

Verwandte Themen