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'
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
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'
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.
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)
$ 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
Tags linux