/ / Zeilennummern von doppelten Einträgen drucken - linux, bash, awk, sed, grep

Zeilennummern doppelter Einträge drucken - linux, bash, awk, sed, grep

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 № 1

Mit 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 hinzu
  • uniq 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