Ich habe eine riesige Datei mit einer Liste von Verzeichnissen und Dateien (generiert von einem find). Der Inhalt ist ungefähr so:

./12345/a1abeff031.dat
./12345/a1abeef03a.dat
./12345/a1abefa032.dat
./12346/c3abeff031.dat
./12346/a1abeff031.dat
./12347/a2abeff021.dat

Ich brauche also nur eine Datei von jedem Verzeichnis (die Reihenfolge spielt keine Rolle). Das gewünschte Ergebnis ist folgendes:

./12345/a1abeff031.dat
./12346/c3abeff031.dat
./12347/a2abeff021.dat

Wie kann ich dies mit shell / awk / grep / sed oder anderen Befehlszeilentools erreichen?

0
leonardorame 18 Jän. 2019 im 03:35

3 Antworten

Beste Antwort

Könnten Sie bitte einmal versuchen, zu folgen.

awk -F'/' '!a[$2]++' Input_file
2
RavinderSingh13 18 Jän. 2019 im 00:41

Dies könnte für Sie funktionieren (GNU sed):

sed -E ':a;N;s/^(([^/]*\/[^/]*\/).*)\n\2.*/\1/;ta;P;D' file

Öffnen Sie ein Fenster mit 2 Zeilen in der gesamten Datei und entfernen Sie alle doppelten Verzeichnisse, die nur das erste drucken.

Verwenden Sie Folgendes, um die letzte Datei in einer Reihe von Duplikaten zu drucken:

sed -E 'N;/^([^/]*\/[^/]*\/).*\n\1/!P;D' file
0
potong 18 Jän. 2019 im 12:29

Verwenden von Perl

perl -F"/" -lane ' print unless $kv{$F[1]}++ ' 

Mit der gegebenen Eingabe

$ cat leonard.txt
./12345/a1abeff031.dat
./12345/a1abeef03a.dat
./12345/a1abefa032.dat
./12346/c3abeff031.dat
./12346/a1abeff031.dat
./12347/a2abeff021.dat
$ perl -F"/" -lane ' print unless $kv{$F[1]}++ ' leonard.txt
./12345/a1abeff031.dat
./12346/c3abeff031.dat
./12347/a2abeff021.dat
$
0
stack0114106 18 Jän. 2019 im 12:53