Compare dois conteúdos de arquivo horizontalmente e verticalmente

1

Eu tenho dois arquivos:

O arquivo1 tem o conteúdo abaixo:

1 2 3 4 5 6 7 8 10

O arquivo 2 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 é.

Por exemplo, neste caso, 9 aparece apenas no Arquivo2, então como posso executar um comando e obter saída ao longo das linhas de

9 is only in File2
    
por FELDAP 06.11.2015 / 13:06

3 respostas

2

Se você tem formatação limpa (espaço x nova linha), o mais fácil é transformar a linha nas linhas e apenas diferenciá-las, desta forma:

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

Em que h.txt é o arquivo horizontal e v.txt é o arquivo vertical

    
por 06.11.2015 / 13:59
1

Você pode querer usar (G) AWK:

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

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

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

Primeiro printf a um cabeçalho para interpretar a saída de comm - fornecendo os nomes de arquivos solicitados - e execute comm na entrada classificada, suprimindo as linhas existentes nos dois arquivos ( -3 ). As duas entradas para comm são substituições de processos em que eu uso a sugestão tr de don_crissti para converter espaços em File1 em novas linhas; em seguida, passe os dois arquivos por meio de sort , que comm requer.

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 entrada 2:

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
    
por 06.11.2015 / 19:29