Compare dois conteúdos de arquivo horizontal e verticalmente

Compare dois conteúdos de arquivo horizontal e verticalmente

Eu tenho dois arquivos:

O arquivo1 tem o conteúdo abaixo:

1 2 3 4 5 6 7 8 10

O arquivo2 tem o conteúdo abaixo:

1
2
3
4
5
6
7
8
9
10

Como posso encontrar a diferença entre dois arquivos e imprimir o número ímpar e também dizer de qual arquivo ele pertence.

Por exemplo, neste caso 9só aparece no Arquivo2, então como posso executar um comando e obter saída nos moldes de

9 is only in File2

Responder1

Se você tiver uma formatação limpa (espaço x nova linha), o mais fácil é transformar a linha em linhas e apenas diferenciá-las, assim:

diff <( sed -e "s/ /\n/g" h.txt ) v.txt

Onde h.txtestá o arquivo horizontal e v.txto arquivo vertical

Responder2

Você pode querer usar (G)AWK:

Para encontrar diferenças, use AWK para converter file1.txt em representação linha por linha primeiro e, em seguida, canalize o resultado para diff:

gawk 'BEGIN {FS = " "} ; {for(i=1; i<=NF; i++) print $i}' file1.txt | diff file2.txt - 

Responder3

Há mais de uma maneira de fazer isso; aqui está comm.

Primeiro, printfum cabeçalho para interpretar comma saída de - fornecendo os nomes dos arquivos solicitados - e depois executar commna entrada classificada, suprimindo as linhas que existem em ambos os arquivos ( -3). As duas entradas commsão substituições de processos onde uso tra sugestão de don_crissti para converter espaços em File1novas linhas; em seguida, passe os dois arquivos sort, o que commrequer.

printf "File1\tFile2\n"; comm -3  <(tr ' ' '\n' < File1 | sort)  <(sort File2)

Execução de amostra

Arquivo de entrada1:

1 2 3 4 5 6 7 8 10 11

Arquivo de entrada2:

1
2
3
4
5
6
7
8
9
10

Saída:

$ printf "File1\tFile2\n"; comm -3 <(sed 's/ /\n/g' File1 |sort ) <(sort File2)
File1   File2
11
        9

informação relacionada