Comando AWK com falha para arquivo grande

0

Eu tenho um arquivo .csv de 6,5 GB. Eu preciso classificar os arquivos com 1ª, 2ª, 3ª, 4ª, 5ª e 13ª coluna e preciso obter os registros exclusivos. Também preciso obter os registros duplicados e redirecioná-los para outro arquivo.

Estou usando o seguinte comando para obter as linhas exclusivas:

awk -F',' 'a[$1,$2,$3,$4,$5,$13]++' /var/tmp/Data.txt > unique.txt

Mas o processo acima está consumindo mais de 3,5 GB de memória e, eventualmente, é terminado. Produzindo o seguinte erro no arquivo de log:

sh: line 1:  7895 Killed                  awk -F',' 'a[$1,$2,$3,$4,$5,$13]++' /var/tmp/Data.txt > unique.txt  

Como posso produzir o resultado necessário?

    
por atanu 22.01.2014 / 06:58

2 respostas

2

Para cada linha em que os campos especificados não são exclusivos, você armazena alguns dados na memória que contém o campo especificado, além de uma pequena sobrecarga. Portanto, a menos que você tenha muitas duplicatas ou os outros campos sejam muito grandes, não é surpreendente que um arquivo de 6,5 GB cause mais de 3,5 GB para ser usado.

Se o arquivo já estiver classificado, você não precisará armazenar todos os dados, apenas para comparar linhas adjacentes.

awk -F ',' '
    {current = $1","$2","$3","$4","$5","$13}
    previous == current {print}
    {previous = current}
'

ou

sed -n -e 'x' -e 'G' -e '/^\(.*)\n$/ { s/\n.*//; p; }' \

Se o arquivo não estiver classificado, a classificação provavelmente será a maneira mais rápida de obter as informações. As implementações típicas de sort são boas com arquivos muito grandes.

    
por 23.01.2014 / 01:41
0

Experimente: você perdeu ! antes de a ?

  $ awk -F',' '!a[$1,$2,$3,$4,$5,$13]++' < /var/tmp/Data.txt > unique.txt

Se o OS ou qualquer outro comando usado para analisá-lo não for 64 bits nem compilado ou projetado para suportar esse tipo de arquitetura, você certamente terá algum problema para lidar com arquivos de 6.5Gb (o processo não será capaz para endereçar a memória requerida). se 32bit: 2 ^ 32 que é em torno de 4Gb será o limite. (poderia ser ainda menor com o interger assinado, por exemplo, o limite será de 2Gb) man largefile O man largefile também pode lhe dar uma pista.

    
por 31.07.2014 / 21:56

Tags