/ / Drukuj numery wierszy zduplikowanych wpisów - linux, bash, awk, sed, grep

Drukowanie numerów linii zduplikowanych wpisów - linux, bash, awk, sed, grep

Mam plik w następującym formacie:

ABRA CADABRA
ABRA CADABRA
boys
girls
meds toys

Chciałbym, aby numer linii został zwrócony z dowolnych zduplikowanych wierszy, aby wyniki wyglądały następująco:

1
2

Wolałbym krótką, jednoliniową komendę z narzędziami linuksowymi. Próbowałem eksperymentować z awk i sed, ale nie odniosłem jeszcze sukcesu.

Odpowiedzi:

0 dla odpowiedzi № 1

Dzięki kombinacji sort, uniq i awk możesz użyć tej serii poleceń.

sort File_Name | uniq -c | awk "{print $2}"

0 dla odpowiedzi nr 2

Tutaj:

uniq -d < $file | while read line; do grep -hn "$line" $file; done

0 dla odpowiedzi № 3

Zrób to:

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

Brzydki, ale działa dla nieposortowanych plików.

$ 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
$

EDYTOWAĆ: W rzeczywistości nieznacznie się skróci:

perl -ne "$l++; if (exists $f{$_}) { if ($f{$_}->[0]++ == 1) { print "$f{$_}->[1]n"; print "$ln"; } } else { $f{$_} = [1,$l]; }" < in.txt

0 dla odpowiedzi nr 4

aby uzyskać wszystkie "różne" duplikaty we wszystkich liniach, które możesz wypróbować:

nl input.txt | sort -k 2 | uniq -D -f 1 | sort -n

to nie da ci tylko numerów linii, ale także duplikatu znalezionego w tych liniach. Pomiń ostatni sort, aby zgrupować duplikaty.

spróbuj też uruchomić:

nl input.txt | sort -k 2 | uniq --all-repeated=separate -f 1

Spowoduje to zgrupowanie różnych duplikatów poprzez dodanie pustej linii między grupami duplikatów.

wyniki rury przez

| cut -f 1 | sed "s/ +//g"

aby uzyskać tylko numery linii.


0 dla odpowiedzi № 5

To by działało:

nl file.txt | uniq -f 1 -D | cut -f 1
  • nl dodaje numer linii do każdej linii
  • uniq znajduje duplikaty
    • -f 1 ignoruje pierwsze pole, tj. numer wiersza
    • -D drukuje (tylko) wiersze, które są duplikowane
  • cut-f 1 pokazuje tylko pierwsze pole (numer linii)

0 dla odpowiedzi № 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