Entfernen doppelter Zeilen nach dem Vergleich des ersten Musters und des speziellen Musters

Entfernen doppelter Zeilen nach dem Vergleich des ersten Musters und des speziellen Musters

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 caim 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 caals 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. FieldsWeitere 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

verwandte Informationen