Arquivo1:
123
234
345
456
Arquivo2:
123
234
343
758
Saída esperada: Arquivo3:
TRUE
TRUE
FALSE
FALSE
portanto, o código deve comparar dois arquivos e imprimir 'TRUE' se corresponder, caso contrário, deve imprimir 'FALSE' no novo arquivo. Alguém poderia fornecer a solução para isso?
text-processing
awk
diff
Velu
fonte
fonte
diff
.comm
. Facilita a lista de linhas que ambos os arquivos têm em comum ou são exclusivos para um ou outro.comm
é que ele requer entrada classificada. Além do fato de que o exemplo na questão não tem entrada classificada, a questão nunca afirma que este é os dados reais que está sendo usado e nunca diz nada sobre a ordenação dos dados.nl
truque de αғsнιη é útilcomm
para impor classificação nos arquivos.Respostas:
Use o
diff
comando a seguir, embash
ou em qualquer outro shell que suporte<(...)
substituições de processo ou você pode emular como mostrado aqui :A saída seria:
--new-line-format='FALSE'$'\n
, imprimaFALSE
se as linhas forem diferentes e, com a--old-line-format=''
desativação da saída, se a linha for diferente para o arquivo1, que é conhecido como comando file to diff antigo (também podemos trocá-los, o que significa que um deles deve imprimirFALSE
outro deve ser desativado.)--unchanged-line-format='TRUE'$'\n'
, imprimaTRUE
se as linhas forem iguais. a$'\n'
sintaxe de escape estilo C é usada para imprimir uma nova linha após cada saída de linha.fonte
Supondo que os arquivos não contenham caracteres de tabulação:
Isso é usado
paste
para criar duas colunas delimitadas por tabulações, com o conteúdo dos dois arquivos em qualquer coluna. Oawk
comando compara as duas colunas em cada linha e imprimeTRUE
se as colunas forem iguais e, caso contrário, será impressoFALSE
.fonte
Supondo que os dois arquivos tenham o mesmo número de linhas:
Isso está fazendo uma comparação numérica se as sequências a serem comparadas forem números e lexicais de outra forma. Por exemplo,
100
e1.0e2
seria considerado idêntico. Mude paraf2"" == $0
para forçar uma comparação lexical em qualquer caso.Dependendo da
awk
implementação, a comparação lexical será feita como se estivesse usandomemcmp()
(comparação de bytes a bytes) ou como se estivesse usandostrcoll()
(se as duas cadeias são iguais na ordem de intercalação da localidade). Isso pode fazer a diferença em alguns locais onde a ordem não está definida corretamente para alguns caracteres, nem em todas as entradas de dígitos decimais, como na sua amostra.fonte
Python 3
Resultado:
Se você precisar
TRUE
eFALSE
em maiúsculas, substitua a linha de impressão por uma destas:fonte
import itertools
primeiro e, em seguida, use emitertools.izip
vez dezip
. Caso contrário, ele lerá os dois arquivos na memória, possivelmente usando muita memória.Em
bash
, lendo cada arquivo em umwhile
loop, comparando as linhas de leitura e imprimindoTRUE
ouFALSE
apropriadamente:As duas chamadas para
read
leituras do descritor de arquivo 3 e 4, respectivamente. Os arquivos são redirecionados para estes com dois redirecionamentos de entrada no loop.fonte
resultado
fonte