
Ich suche nach Code zum Entfernen doppelter Zeilen nach dem Vergleich des ersten tabulatorgetrennten Musters:
Beispiel: ( ↦
= Tabulator)
car ↦ ab ↦ 38/43
car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
house ↦ d ↦ 2/3
house ↦ ht ↦ 3/7
boat ↦ as ↦ 5/5
Ich möchte zwei doppelte Zeilen löschen, mit der Einschränkung, dass die Zeile ca
im zweiten Feld nicht gelöscht werden soll.
Ergebnis:
car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
boat ↦ as ↦ 5/5
Irgendwelche Ideen? Ich habe sed und sort ausprobiert, aber ich bekomme keinen funktionierenden Code.
Antwort1
Ich gehe davon aus, dass es bei doppelten Einträgen immer einen mit ca
als zweites Feld gibt.
In Ihren Beispieldaten sind alle Zeilen, die dasselbe erste Feld haben, gruppiert, aber Sie haben nicht erwähnt, ob das immer der Fall ist. Wenn ja, ist die Aufgabe etwas einfacher, aber das folgende awk-Skript funktioniert auch, wenn die übereinstimmenden Zeilen nicht gruppiert sind.
dedup.awk
#!/usr/bin/awk -f
{
if (!($1 in lines) || ($2 == "ca"))
lines[$1] = $0
}
END{
for (i in lines)
print lines[i]
}
Wenn die Eingabedatei heißt data
, führen Sie sie wie folgt aus:
awk -f dedup.awk data
oder
awk -F '\t' -f dedup.awk data
um sicherzustellen, dass Tabulatoren als Feldtrennzeichen verwendet werden; das Standardfeldtrennzeichen ist ein oder mehrere Leerzeichen und/oder Tabulatoren. Fields
Weitere Informationen finden Sie auf der Manpage von gawk.
Aufgrund der Funktionsweise von awk-Arrays weisen die Ausgabedaten wahrscheinlich nicht dieselbe Reihenfolge auf wie die Quelldaten. Die ursprüngliche Reihenfolge könnte mit einem etwas komplizierteren Programm beibehalten werden, oder die Ausgabe könnte mit einer der Sortierfunktionen von awk sortiert werden. Es ist jedoch wahrscheinlich flexibler, den Bash-Befehl „sort“ zu verwenden.
Dieses Awk-Skript kann bei Bedarf gekürzt werden:
awk '{if(!($1 in a)||($2=="ca"))a[$1]=$0};END{for(i in a)print a[i]}' data