Eu tenho dois arquivos: arquivo1 com cerca de 10.000 linhas e arquivo2 com algumas centenas de linhas. Quero verificar se todas as linhas do arquivo2 ocorrem no arquivo1. Ou seja: ∀ linha ∈ arquivo2: ∈ ∈ arquivo1
Se alguém não souber o que esses símbolos significam ou o que "verificar se todas as linhas do arquivo2 ocorrem no arquivo1" significa: Várias linhas equivalentes nos dois arquivos não influenciam se a verificação retorna que os arquivos atendem ou não ao requisito.
Como eu faço isso?
text-processing
UTF-8
fonte
fonte
file2
contém 2 linhasA
, você precisafile1
conter pelo menos 2 linhasA
?Respostas:
Este comando produzirá linhas exclusivas para
file_2
. Portanto, se a saída estiver vazia, todas asfile_2
linhas estarão contidas nofile_1
.Do homem do comm:
fonte
-u
opção adicionada aosort
comando. Agora, apenas linhas únicas são deixadas nos dois arquivos classificados.<
canal estava em stdin. O termo entre colchetes muda isso?file_1
na forma pré-definida. Economiza digitação e tempo.Se o número de correspondências do arquivo2 no (as linhas exclusivas de) arquivo1 for igual ao número de linhas exclusivas no arquivo2, elas estarão todas lá; caso contrário, eles não são.
fonte
Usar o GNU
awk
onde ele suportalength(array)
recursos específicos (e alguma outraawk
implementação que possa suportar) e não é necessário se os arquivos forem classificados.Isso está lendo o arquivo2 em uma matriz chamada
seen
com a chave como linha inteira do arquivo2 .Em seguida, leia o arquivo1 e, para cada linha, se corresponder às linhas da matriz vista, exclua essa chave.
No final, se a matriz estava vazia, todas as linhas do arquivo2 existem no arquivo1 e serão impressas
Matched
, caso contrário, serão exibidasNot Matched
.Para a compatibilidade em todas as
awk
implementações.Para ignorar linhas vazias / ou linhas com espaços em branco somente se no arquivo2 , você precisará adicionar
NF
à condiçãoNR==FNR && NF {...
para pular a leitura delas na matriz.fonte
length(array)
é apenas um AFAIK; definitivamente não é POSIX.Usando
comm
você pode encontrar linhas que são comuns nos dois arquivos.Dê uma olhada
man comm
para mais detalhesfonte
comm
- compare dois arquivos classificados linha por linha".comm
contém uma solução que não está obviamente incorreta. Quando executo seu comando, recebo avisos de que os arquivos não estão na ordem de classificação e muitas linhas que definitivamente estão nos dois arquivos.produzirá nenhuma saída se
file1
contém todas as linhas emfile2
e sair com o status0
, caso contrário ele irá imprimir algo comoe saia com status
1
fonte
Use um programa Python:
Uso:
O status de saída do programa indica se todos os padrões do arquivo 2 foram correspondidos:
Para consultar o status de saída em um shell (roteiro) você pode usar a
$?
variável especial ou outras expressões que avaliam o status de saída de comando, por exemplo, operadores de curto-circuito&&
e||
e expressões condicionais comoif
ouwhile
. Exemplo:fonte
combine
de moreutils vai lhe mostrar todas as linhas emfile2
que não estão emfile1
com:Em seguida, você pode contar o número de linhas canalizando-o para
wc -l
, como:fonte