não pode testar sem alguns dados de amostra, mas algo assim:
paste <(generate-keys "$filename") "$filename" |
awk '! seen[$1]++ {print $2}'
Eu tenho um arquivo A de linhas de igual comprimento n. Eu tenho um programa que para cada linha em A pode produzir uma linha de comprimento n qual sua chave. O programa pode gravar a seqüência de chaves para as linhas em A em um arquivo B ou escrevê-las para stdout para cada linha de A.
Eu preciso obter todas as linhas de A para que as respectivas chaves não se repitam. Qual seria a maneira mais eficiente de conseguir isso? Eu vejo que há uma opção -k no tipo, mas não parece fazer o que eu quero.
Editar. Para esclarecer o comentário.
Suponha que A contenha as linhas
foo
bar
baz
e que o segundo programa calcula as chaves para essas saídas de linhas
xxx
yyy
xxx
em que a primeira linha é a saída para foo, a segunda para bar e a terceira para baz.
Então uma das saídas corretas seria
foo
bar
Como você especificou (mas considere o comentário de wurtel sobre sua pergunta):
generate_keys A > B # adjust this call however that program is defined to work
awk '
NR==FNR { a[NR]=$1 ; next }
!b[$1]++ { print a[FNR] }
' A B
$ getkeys A > B
$ sort B | uniq -c | awk '{if($1 == 1) print $2}' > C
$ paste B A | fgrep -f C | cut -f2-
Explicação:
Primeiro, gere as chaves para cada linha.
Em seguida, conte o número de vezes que cada tecla ocorre e salve as chaves que ocorrem uma vez no arquivo C.
Em seguida, junte as chaves com as linhas usando paste
, combine essas linhas com a lista de chaves exclusivas com fgrep
e selecione apenas a linha (omitindo a chave) usando cut
.
Talvez seja melhor deixar as sequências em C começarem com ^
e usar grep
em vez de fgrep
, para que elas correspondam apenas ao início da linha, ou seja, a chave, mas se for algo como um md5sum então as chances de falsas correspondências serão pequenas. (E eu sou preguiçoso :-))