awk para dividir o arquivo de entrada em 2 arquivos (um para valores duplicados e um para valores únicos)

3

Eu tenho um arquivo de entrada como abaixo.

file.txt
14 2.692022 author1 0
14 2.57826 author2 1
229 2 author3 2
323 2 author4 3
514 2.0625 author5 4

Estou tentando dividir o arquivo com os valores duplicados como um arquivo e o restante dos valores como outro arquivo. Então, para a entrada acima, estou tentando gerar arquivos como

file1.txt
14 2.692022 author1 0
14 2.57826 author2 1

file2.txt
229 2 author3 2
323 2 author4 3
514 2.0625 author5 4

Não consigo descobrir como usar o awk para esse propósito.

awk '{print $1}' file.txt | uniq -d > file1.txt

O comando acima me fornece apenas os valores duplicados em um arquivo. Além disso, isso me dá apenas o campo1, mas não todos os 3 campos.

    
por Ramesh 11.03.2014 / 23:20

1 resposta

3

awk suporta o redirecionamento direto de arquivos em sua sintaxe.

awk 'BEGIN{prev=""} {if($1==prev) { print $0 > "duplicates.txt"} else { print $0 > "originals.txt"}; prev=$1; }' file.txt

Eu assumi que o arquivo já está classificado. Se não for, fica muito mais difícil.

EDIT: isso é melhor?

awk 'BEGIN{prev=""; prevfull=""}
$1==prev{ if(prevfull!=""){print prevfull > "duplicates.txt"; prevfull=""}; print > "duplicates.txt"}
$1!=prev{ if(prevfull!=""){print prevfull > "originals.txt"}; prevfull=$0}
{prev=$1; } END{print prevfull}' file.txt

Pode definitivamente ser feito melhor (os ifs definitivamente não são ideais), mas mostra a ideia geral.

    
por 11.03.2014 / 23:27

Tags