perl -F, -lane '
exists $h{$F[0]} or $h[$h{$F[0]}=@h]=$_;
$h=$_; /,false$/ or $_=$h for $h[$h{$F[0]}];
END{ print for @h; }
' duplicates.file
Datenstrukturen:
- Hash,
%h
dessen Schlüssel erste Felder sind (AAA, BBB, CCC usw.) und entsprechende Werte sind Zahlen, die die Reihenfolge angeben, in der die Schlüssel gefunden wurden. So ist zB Schlüssel AAA => 0, Schlüssel BBB => 1, Schlüssel CCC => 2.
- Array,
@h
dessen Elemente Zeilen sind, die in der Reihenfolge des Druckens enthalten sind. Wenn also sowohl wahr als auch falsch in Daten gefunden werden, wird der falsche Wert in das Array übernommen. OTW, wenn es einen Datentyp gibt, dann wäre dieser vorhanden.
Ein anderer Weg ist die Verwendung von GNU sed:
sed -Ee '
G
/^([^,]*),(false|true)\n(.*\n)?\1,\2(\n|$)/ba
/^([^,]*)(,true)\n(.*\n)?\1,false(\n|$)/ba
/^([^,]*)(,false)\n((.*\n)?)\1,true(\n|$)/{
s//\3\1\2\5/;h;ba
}
s/([^\n]*)\n(.*)$/\2\n\1/;s/^\n*//
h;:a;$!d;g
' duplicates.file
FWIW, der POSIX-äquivalente Code für den obigen GNU-sed-Code ist unten aufgeführt:
sed -e '
G
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false$/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false\n/ba
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true$/{
s//\3\1\2/
h
ba
}
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true\n/{
s//\3\1\2\n/
h
ba
}
y/\n_/_\n/
s/\([^_]*\)_\(.*\)$/\2_\1/;s/^_*//
y/\n_/_\n/
h;:a;$!d;g
' duplicates.file
Erläuterung
- Bei dieser Methode speichern wir das Ergebnis, das endgültig gedruckt werden soll, im Haltebereich.
- Für jede gelesene Zeile hängen wir den Haltebereich an den Musterraum an, um die aktuelle Zeile im Hinblick auf den vorhandenen Zustand des Haltebereichs zu untersuchen.
- Jetzt können bei diesem Vergleich möglicherweise 5 Dinge passieren:
- a) Die aktuelle Zeile stimmt irgendwo in der Haltezeile überein & false: false.
- [AKTION] Da derselbe falsche Zustand gefunden wird, tun Sie nichts.
- b) Die aktuelle Zeile stimmt mit der Haltelinie überein & true: true.
- [AKTION] Da derselbe wahre Zustand gefunden wird, tun Sie nichts.
- c) Die aktuelle Zeile stimmt mit der Haltelinie überein & true: false.
- [AKTION] Da bereits ein falscher Zustand vorliegt, tun Sie nichts.
- d) Die aktuelle Zeile stimmt irgendwo in der Haltelinie überein & false: true.
- [ACTION] Dies erfordert einige Arbeit, da wir die falsche Linie genau an der Stelle ersetzen müssen, an der sich die wahre befindet.
- e) Die aktuelle Leitung stimmt NICHT mit der Haltelinie überein.
- [AKTION] Verschieben Sie die aktuelle Zeile bis zum Ende.
Ergebnisse
AA,false
BB,false
CC,false
DD,true
true
wenn es die erste Instanz der ersten Spalte ist?