Eu tenho um arquivo grande composto por campos de texto separados por ponto e vírgula na forma de uma tabela grande. Foi ordenado. Eu tenho um arquivo menor composto pelos mesmos campos de texto. Em algum momento, alguém concatenou esse arquivo com outras pessoas e, em seguida, fez uma classificação para formar o arquivo grande descrito acima. Eu gostaria de subtrair as linhas do arquivo pequeno do arquivo grande (por exemplo, para cada linha do arquivo pequeno, se existir uma sequência correspondente no arquivo grande, exclua essa linha no arquivo grande).
O arquivo é mais ou menos assim
GenericClass1; 1; 2; NA; 3; 4;
GenericClass1; 5; 6; NA; 7; 8;
GenericClass2; 1; 5; NA; 3; 8;
GenericClass2; 2; 6; NA; 4; 1;
etc
Existe uma maneira rápida e elegante de fazer isso ou eu tenho que usar o awk?
fonte
-x
opção também, caso uma linha no arquivo menor me acontecesse uma substring de outra linha no arquivo principal. Além disso, é bem possível que a resposta de @ UlrichSchwarz seja mais rápida.comm
é seu amigo:(
comm
provavelmente terá um benefício de desempenho,grep
pois leva em consideração a classificação.)Por exemplo:
fonte
comm -1 -3 file.txt bigfile.txt > newbigfile.txt
comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)