Ich habe eine Datei mit einer Spalte mit Namen, die sich jeweils mehrmals wiederholen. Ich möchte jede Wiederholung zu einer zusammenfassen, während alle anderen Wiederholungen mit demselben Namen beibehalten werden, die nicht an andere Wiederholungen mit demselben Namen angrenzen.
ZB möchte ich die linke Seite zur rechten Seite drehen:
Golgb1 Golgb1
Golgb1 Akna
Golgb1 Spata20
Golgb1 Golgb1
Golgb1 Akna
Akna
Akna
Akna
Spata20
Spata20
Spata20
Golgb1
Golgb1
Golgb1
Akna
Akna
Akna
Dies ist, was ich verwendet habe: perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt
Diese Methode hält jedoch nur einen Vertreter von links (dh Golb1 und Akna werden nicht wiederholt).
Gibt es eine Möglichkeit, eindeutige Namen für jeden Block beizubehalten, während Namen beibehalten werden, die sich in mehreren nicht benachbarten Blöcken wiederholen?
sort | uniq
sort -u
(:Awk
Lösung:Die Ausgabe:
quelle
Versuchen Sie dies - speichern Sie die vorherige Zeile und vergleichen Sie sie mit der aktuellen Zeile
Sie haben auch getaggt
uniq
- haben Sie es versucht?quelle
Mit sed kann es wie folgt gemacht werden:
Hier haben wir im Musterraum jederzeit 2 Zeilen. Wenn der Vergleich zwischen ihnen fehlschlägt, drucken wir die erste und hacken sie von vorne und gehen zurück und fügen die nächste Zeile in den Musterbereich ein. Spülen ... wiederholen
Wenn Sie Perl im Slurp-Modus verwenden, behandeln wir die gesamte Datei als eine lange Zeichenfolge, auf die der reguläre Ausdruck angewendet wird, der den Vergleich für Sie durchführt.
quelle
Frage zu Rakesh Sharmas Sed-Lösung.
Was ist, wenn Sie eine Eingabedatei haben wie:
Und Sie möchten, dass eine Ausgabedatei wie folgt lautet:
Beachten Sie die fehlenden:
Ich weiß, dass der gewünschte Befehl Ihrer Lösung ähnlich ist:
Kann nicht richtig geändert werden, um beide Spalten zu drucken, und kann nur auf diese spezielle Weise mit Werten für Spalte 2 sortiert werden. Irgendwelche Tipps?
quelle
sed -e '$!N' -e '/.*\.\([0-9]*\)\n.*\.\1$/!{P;D;}' -e 's/\n.*//;s/^/\n/;D'
löscht die nachfolgenden sich wiederholenden Elemente. Hinweis: Dies erfordertGNU sed
. Für dasPOSIX
Verhalten muss es leicht geändert werden.