Estou tentando obter linhas exclusivas em um arquivo com várias colunas.
Meu arquivo "file.txt" contém o registro de exemplo abaixo
20230830,52678,004,Apple,21
20230830,52678,004,Apple,20
20230830,52678,004,Apple,19
20230831,47689,001,Orange,15
20230901,47620,002,Grape,29
Minha saída desejada é imprimir apenas linhas únicas da coluna 1 a 4. Independentemente do valor na coluna 5
20230831,47689,001,Orange,15
20230901,47620,002,Grape,29
Tentei usar sed para adicionar um separador exclusivo entre as colunas 1-4 e a coluna 5
E então eu uso o comando awk para obter linhas exclusivas da coluna 1-4
sed 's/,/|/4' file.txt | awk -F"|" '{arr[$1]++} END{for(i in arr) if(arr[i]==1) print $0}'
Com esse código ele funciona com um pequeno conjunto de dados mas quando uso em um arquivo com 1000 linhas, obtenho...
20230831,47689,001,Orange,15
20230831,47689,001,Orange,15
20230831,47689,001,Orange,15
20230831,47689,001,Orange,15
...
valores únicos continuam chegando. Eles estão duplicando. Parece que estou recebendo apenas uma linha única e ela continua duplicando.
Você pode me ajudar se houver algo errado com meu código?
Espero imprimir apenas linhas exclusivas como esta
20230831,47689,001,Orange,15
20230901,47620,002,Grape,29
Não há necessidade de usar
sed
para converter o delimitador de campo de,
para|
, poisawk
é capaz de analisar o arquivo em,
.Uma
awk
ideia:Isso gera:
NOTA: a ordem em que os índices do array são processados não é garantida; se a saída precisar ser classificada em uma ordem específica, poderíamos adicionar mais código
re: Comentário do OP:
I just need to make it in one line.
Algumas opções vêm à mente:Coloque o código atual em uma linha, por exemplo:
Coloque o
awk
código em um arquivo separado (por exemplo,key.awk
) e faça referência ao arquivo naawk
invocação, por exemplo:Awk pode resolver seu problema sozinho:
Este canal Unix identificará linhas em seu arquivo que são duplicadas com base nos primeiros 4 campos:
Você pode então usar
grep
para inverter essa correspondência para que as duplicatas sejam ignoradas:Impressões:
A vantagem aqui é o menor requisito de memória, já que você não precisa manter o arquivo inteiro na memória.