compara dois arquivos ignorando a primeira coluna e o número da linha de impressão

0

como posso imprimir o número da linha de diferença ignorando a 1ª coluna para separar arquivos separados por tabulações?

exemplo- compare o Arquivo 1 contra o Arquivo 2 ignorando a 1ª coluna e imprima a linha nº. por registro de diferença presente no arquivo 2.

no arquivo1:

user1   fistname    Lastnamename
user2   Johnny            Depp
user3   Tom               Cruise
user4   Leonardo          DiCaprio
user5   Sylvester         Stallone

e

no arquivo2:

user10   fistname    Lastnamename
user2   Johnny            Depp
user30  Tom'               Cruise
user4   Nicolas           Cage
user50  Sylvester         Stallone

resultado esperado: -     diferença no arquivo2 é para o número de linha 3,4

O tamanho do arquivo de observação a ser comparado está em GB e o arquivo está separado por tabulação

    
por Ameya Topre 21.02.2017 / 05:57

4 respostas

0

Tente com este código, não sei se isso funcionará, pois não tenho dados suficientes:

diff --unchanged-line-format="" --old-line-format="" --new-line-format=":%dn: %L" file1 file2 | sed 1d | cut -d':' -f2 |tr '\n' ','|sed 's/,$//g'
    
por 21.02.2017 / 06:28
0

Isso pode responder à sua pergunta:

awk 'NR==FNR{++a[$2,$3];next} {line++;if(!(a[$2,$3])){print line}}' record1 record2

Explicação:

FNR==NR

Quando você tem dois (ou mais) arquivos de entrada para awk , o FNR irá redefinir para 1 na primeira linha do próximo arquivo, enquanto o NR continuará incrementando de onde parou. Verificando FNR==NR estamos essencialmente verificando para ver se estamos analisando o primeiro arquivo.

++a[$2,$3]

Se estivermos analisando o primeiro arquivo (veja acima), crie um link associativo array com o primeiro campo $ 2 e segundo campo $ 3 como a chave e pós incrementa o valor em 1.Este essencialmente nos permite criar uma lista 'vista'.

next

Este comando diz ao awk para não processar nenhum outro comando e ler em o próximo registro e começar de novo. Fazemos isso porque o arquivo1 serve apenas para definir o array associativo

!(a[$2,$3])

Esta linha só é executada quando FNR == NR é falsa, ou seja, não estamos analisando file1 e, portanto, deve estar analisando file2. Em seguida, usamos o primeiro campo $ 1 e o segundo campo $ 2 do arquivo2 como a chave para indexar em nossa lista 'vista' criada anteriormente. Se o valor retornado é 0 significa que não o vimos no arquivo1 e, portanto, deve imprimir esta linha. Por outro lado, se o valor for diferente de zero, vi no arquivo1 e, portanto, não devemos imprimir seu valor. Note que! (A [$ 2, $ 3]) é equivalente a! (A [$ 2, $ 3]) {print} porque a ação padrão quando um não é dado é imprimir a linha inteira.

    
por 21.02.2017 / 06:26
0

Você pode usar o comando diff junto com o corte para encontrar a diferença nos dois arquivos.

diff <(cut -f2 -d$'\t' file1) <(cut -f2 -d$'\t' file2)

A saída será

3,4c3,4
< Tom
< Leonardo
---
> Tom'
> Nicolas

Se você se preocupa com os registros mais duplicados, então você pode usar o comando acima com sort -u para remover duplicatas antes de encontrar o diff do outro arquivo. Comando será

diff <(cut -f2 -d$'\t' file1|sort -u) <(cut -f2 -d$'\t' file2|sort -u)
    
por 21.02.2017 / 06:50
-1
$ echo -n 'difference in file2 is for line number ';diff --unchanged-line-format="" --old-line-format="" --new-line-format="%dn " <(tail +2 file1|unexpand -a|cut -f2-) <(tail +2 file2|unexpand -a|cut -f2-)|grep -o "[0-9]*" | while read i;do echo $((i+1));done|paste -sd,
difference in file2 is for line number 3,4
    
por 21.02.2017 / 06:27

Tags