Ich habe eine Datei im folgenden Format:
ABRA CADABRA
ABRA CADABRA
boys
girls
meds toys
Ich möchte, dass die Zeilennummer von doppelten Zeilen zurückgegeben wird, die Ergebnisse würden also wie folgt aussehen:
1
2
Ich würde einen kurzen einzeiligen Befehl mit Linux-Werkzeugen bevorzugen. Ich habe versucht, mit awk und sed zu experimentieren, hatte aber bisher noch keinen Erfolg.
Antworten:
0 für die Antwort № 1Mit einer Kombination aus sort, uniq und awk können Sie diese Befehlsfolge verwenden.
sort File_Name | uniq -c | awk "{print $2}"
0 für die Antwort № 2
Hier:
uniq -d < $file | while read line; do grep -hn "$line" $file; done
0 für die Antwort № 3
Mach das:
perl -e "my $l = 0; while (<STDIN>) { chomp; $l++; if (exists $f{$_}) { if ($f{$_}->[0]++ == 1) { print "$f{$_}->[1]n"; print "$ln"; } } else { $f{$_} = [1,$l]; } }" < FILE
Hässlich, funktioniert aber für unsortierte Dateien.
$ cat in.txt
ABRA CADABRA
ABRA CADABRA
boys
girls
meds toys
girls
$ perl -e "my $l = 0; while (<STDIN>) { chomp; $l++; if (exists $f{$_}) { if ($f{$_}->[0]++ == 1) { print "$f{$_}->[1]n"; print "$ln"; } } else { $f{$_} = [1,$l]; } }" < in.txt
1
2
4
6
$
BEARBEITEN: Eigentlich wird es etwas verkürzen:
perl -ne "$l++; if (exists $f{$_}) { if ($f{$_}->[0]++ == 1) { print "$f{$_}->[1]n"; print "$ln"; } } else { $f{$_} = [1,$l]; }" < in.txt
0 für die Antwort № 4
Um alle "verschiedenen" Duplikate in allen Zeilen zu erhalten, können Sie versuchen:
nl input.txt | sort -k 2 | uniq -D -f 1 | sort -n
Sie erhalten dann nicht nur die Zeilennummern, sondern auch das in diesen Zeilen gefundene Duplikat. Lassen Sie die letzte Sortierung aus, um die Duplikate zusammenzufassen.
Versuchen Sie auch, zu laufen:
nl input.txt | sort -k 2 | uniq --all-repeated=separate -f 1
Dadurch werden die verschiedenen Duplikate gruppiert, indem eine leere Zeile zwischen den Duplikatgruppen hinzugefügt wird.
Rohrergebnisse durch
| cut -f 1 | sed "s/ +//g"
nur Zeilennummern erhalten.
0 für die Antwort № 5
Das würde funktionieren:
nl file.txt | uniq -f 1 -D | cut -f 1
nl
fügt jeder Zeile eine Zeilennummer hinzuuniq
findet Duplikate-f 1
ignoriert das erste Feld, d. h. die Zeilennummer-D
druckt (nur) die doppelten Zeilen
cut
-f 1
zeigt nur das erste Feld (die Zeilennummer)
0 für die Antwort № 6
$ awk "{a[$0]=($0 in a ? a[$0] ORS : "") NR} END{for (i in a) if (a[i]~ORS) print a[i]}" file
1
2