
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 9
só 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.txt
está o arquivo horizontal e v.txt
o 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, printf
um cabeçalho para interpretar comm
a saída de - fornecendo os nomes dos arquivos solicitados - e depois executar comm
na entrada classificada, suprimindo as linhas que existem em ambos os arquivos ( -3
). As duas entradas comm
são substituições de processos onde uso tr
a sugestão de don_crissti para converter espaços em File1
novas linhas; em seguida, passe os dois arquivos sort
, o 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 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