perl -F, -lane '
exists $h{$F[0]} or $h[$h{$F[0]}=@h]=$_;
$h=$_; /,false$/ or $_=$h for $h[$h{$F[0]}];
END{ print for @h; }
' duplicates.file
Strutture dati:
- Hash le
%h
cui chiavi sono i primi campi (AAA, BBB, CCC, ecc.) Ei valori corrispondenti sono numeri che indicano l'ordine in cui sono state rilevate le chiavi. Pertanto, ad es. Chiave AAA => 0, chiave BBB => 1, chiave CCC => 2.
- Matrice i
@h
cui elementi sono linee contenute nell'ordine di stampa. Quindi, se nei dati vengono rilevati sia vero che falso, il valore falso andrà nell'array. OTW, se esiste un tipo di dati, sarebbe presente.
Un altro modo è usare GNU sed:
sed -Ee '
G
/^([^,]*),(false|true)\n(.*\n)?\1,\2(\n|$)/ba
/^([^,]*)(,true)\n(.*\n)?\1,false(\n|$)/ba
/^([^,]*)(,false)\n((.*\n)?)\1,true(\n|$)/{
s//\3\1\2\5/;h;ba
}
s/([^\n]*)\n(.*)$/\2\n\1/;s/^\n*//
h;:a;$!d;g
' duplicates.file
FWIW, il codice equivalente POSIX per il precedente codice GNU-sed è elencato di seguito:
sed -e '
G
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false$/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false\n/ba
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true$/{
s//\3\1\2/
h
ba
}
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true\n/{
s//\3\1\2\n/
h
ba
}
y/\n_/_\n/
s/\([^_]*\)_\(.*\)$/\2_\1/;s/^_*//
y/\n_/_\n/
h;:a;$!d;g
' duplicates.file
Spiegazione
- In questo metodo memorizziamo il risultato da stampare infine nello spazio di attesa.
- Per ogni riga letta, aggiungiamo lo spazio di mantenimento allo spazio del modello per l'esame della linea corrente di fronte allo stato esistente dello spazio di attesa.
- Ora possono succedere 5 cose durante questo confronto:
- a) La linea corrente corrisponde da qualche parte nella linea di attesa e false: false.
- [AZIONE] Poiché viene rilevato lo stesso falso stato, non fare nulla.
- b) La linea corrente corrisponde da qualche parte nella linea di attesa e true: true.
- [AZIONE] Poiché viene trovato lo stesso vero stato, non fare nulla.
- c) La linea corrente corrisponde da qualche parte nella linea di attesa e true: false.
- [AZIONE] Poiché esiste già un falso stato, non fare nulla.
- d) La linea corrente corrisponde da qualche parte nella linea di attesa e false: true.
- [AZIONE] Ciò comporta un po 'di lavoro, in quanto dobbiamo sostituire la falsa linea nella stessa posizione esatta in cui si trova il vero.
- e) La linea corrente NON corrisponde in alcun punto della linea di attesa.
- [AZIONE] Sposta la riga corrente alla fine.
risultati
AA,false
BB,false
CC,false
DD,true
true
se è la prima istanza della prima colonna?