awk combina dois arquivos grandes e remove linhas duplicadas [closed]

3

Eu tenho dois arquivos:

A.txt - cerca de 90 GB | B.txt - cerca de 80 GB

Eu quero combinar dois arquivos e remover linhas duplicadas.

Como faço isso?

Se outros comandos, além de awk , forem melhores para esse trabalho, avise-nos.

    
por WestFarmer 10.03.2017 / 14:25

3 respostas

1

Provavelmente você não pode usar awk hashes, pois isso significaria armazenar todas as linhas exclusivas na memória. Então, só poderia ser usado se o arquivo de saída for significativamente menor que a memória disponível no sistema.

Se os arquivos de entrada já estiverem classificados, você poderia fazer:

sort -mu A.txt B.txt > C.txt

Pode ser necessário alterar a localidade para uma que tenha a mesma ordem de classificação usada para classificar os arquivos.

Isso não precisa armazenar mais de uma linha de cada arquivo na memória de cada vez.

Se eles não foram classificados, remova o -m , defina $TMPDIR para um diretório em um sistema de arquivos (preferencialmente rápido) com 170 GB de espaço livre e esteja preparado para aguardar um pouco.

O resultado, no entanto, será classificado, o que acelerará a fusão de outro arquivo mais tarde, se necessário.

sort usará arquivos temporários, para que funcionem mesmo no sistema com pouca memória. Mas quanto mais memória você tiver, melhor. Com o GNU sort , consulte também as opções --compress-program e --buffer-size , que podem ajudá-lo a melhorar o desempenho. Se a ordem de classificação usada não for importante para você, corrija a localidade para C (com LC_ALL=C sort... ), pois isso seria o mais eficiente.

    
por 10.03.2017 / 15:34
0

Experimente este comando:

cat A.txt B.txt | awk '!seen[$0]++' > C.txt

Pode demorar um pouco com arquivos tão pesados ...

    
por 10.03.2017 / 14:29
0
printf "">MergeFile
cat A.txt B.txt | 
while IFS= read -r line; do 
  if [ ! -z "$line" ]; then
    if ! grep -Fxqe "$line" MergFile; then
      echo "$line">>MergeFile;
    fi
  fi
done

Explicação

Crie um novo MergeFile com printf "">MergeFile # ou opcionalmente: touch MergeFile

Canalize os dois arquivos para um loop while:
cat A.txt B.txt |

Leia cada linha:
while IFS= read -r line; do

Manipular linhas em branco:
if [ ! -z "$line" ]; then
* Se você quiser manter a primeira linha em branco, adicione-a novamente em uma cláusula else

Resultados vazios significam que é a primeira vez que entra no MergeFile (ou seja, é exclusivo):% if ! grep -Fxqe "$line" MergFile; then

Adicione ao MergeFile:% echo "$line">>MergeFile;

    
por 10.03.2017 / 16:36