Comando Unix per verificare se due righe in un file sono uguali?


24

Esiste un comando unix che può verificare se due righe in un file sono uguali?

Ad esempio, considera un file sentences.txt

This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

Vediamo che la frase

This is sentence X

si ripete.

Esiste un comando in grado di rilevare rapidamente questo, in modo che io possa forse eseguirlo in questo modo -

$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X

Risposte:


40

Ecco un modo per ottenere l'output esatto che stai cercando:

$ grep -nFx "$(sort sentences.txt | uniq -d)" sentences.txt 
1:This is sentence X
4:This is sentence X

Spiegazione:

L'interno $(sort sentences.txt | uniq -d)elenca ogni riga che si verifica più di una volta. L'esterno grep -nFxcerca nuovamente sentences.txtle -xcorrispondenze esatte con una di queste righe -Fe antepone il loro numero di riga-n


La tua modifica mi ha appena battuto dal pubblicare la stessa identica risposta. +1
casey

Quindi la sintassi $ (comando) funziona come una sorta di sostituzione?
CodeBlue,

2
@CodeBlue - sì. Si chiama Command Substitution
grebneke,

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txtsarebbe un po 'più efficiente ed eviterebbe potenziali arg list too longproblemi.
Stéphane Chazelas,

10

Non esattamente quello che vuoi, ma puoi provare a combinare sorte uniq -c -d:

aularon@aularon-laptop:~$ cat input
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

aularon@aularon-laptop:~$ sort input | uniq -cd
      2 This is sentence X
aularon@aularon-laptop:~$ 

2ecco il numero di duplicati trovati per la riga, da man uniq:

   -c, --count
          prefix lines by the number of occurrences

   -d, --repeated
          only print duplicate lines

6

Se il contenuto del file si adatta alla memoria awkè buono per questo. Il one-liner standard in comp.lang.awk (non riesco a cercare un'istanza da questa macchina ma ce ne sono diversi ogni mese) per rilevare solo che c'è una duplicazione awk 'n[$0]++'che conta le occorrenze di ciascun valore di riga e stampa ogni occorrenza (e) diverso dal primo, perché l'azione predefinita è print $0.

Per mostrare tutte le occorrenze, inclusa la prima, nel tuo formato, ma possibilmente in ordine misto quando viene duplicato più di un valore, diventa un po 'più schizzinoso:

awk <sentences.txt ' !($0 in n) {n[$0]=NR;next} \
    n[$0] {n[$0]=0; print "Line "n[$0]":"$0} \
    {print "Line "NR":"$0} '

Indicato in più righe per maggiore chiarezza, di solito si corre insieme nell'uso reale. Se lo fai spesso puoi mettere lo awkscript in un file awk -fo, ovviamente, tutto in uno script di shell. Come il più semplice, awkquesto può essere fatto in modo molto simile con perl -n[a].

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.