linhas com soma de verificação única

1

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
    
por Jernej 16.03.2015 / 16:16

3 respostas

2

não pode testar sem alguns dados de amostra, mas algo assim:

paste <(generate-keys "$filename") "$filename" |
awk '! seen[$1]++ {print $2}'
    
por 16.03.2015 / 16:27
3

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
    
por 16.03.2015 / 16:45
2
$ 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 :-))

    
por 16.03.2015 / 16:31

Tags