Divide um arquivo de texto em vários arquivos de acordo com o conteúdo da coluna

0

Eu tenho um arquivo assim:

1 : Aa|xxx Aa|xxx Bb|xxx Cc|xxx Cc|xxx Cc|xxx 
2 : Cc|xxx Aa|xxx Aa|xxx Aa|xxx Bb|xxx    
3 : Bb|xxx Bb|xxx Aa|xxx Cc|xxx    
4 : Bb|xxx Aa|xxx Cc|xxx    
5 : Aa|xxx Cc|xxx Bb|xxx 

O xxx representa um código individual Aa , por exemplo, para um nome. Cada linha sempre tem todos os três nomes.

Eu gostaria de ter três arquivos contendo o número da linha (primeira coluna) e apenas um nome. Algo parecido com isto:

1 : Aa|xxx Aa|xxx
2 : Aa|xxx Aa|xxx Aa|xxx
3 : Aa|xxx
4 : Aa|xxx
5 : Aa|xxx

Alguém poderia me ajudar com isso? Eu ficaria super feliz. Obrigado antecipadamente!

    
por Wiebke 10.09.2016 / 11:03

2 respostas

2

Uma abordagem possível é remover o conteúdo extra:

perl -pe 's/ (Bb|Cc)\S*//g' file > A
perl -pe 's/ (Aa|Cc)\S*//g' file > B
perl -pe 's/ (Aa|Bb)\S*//g' file > C

(o outro pode ser feito com sed, awk, ex)

    
por 10.09.2016 / 11:26
0

Como apontado por @JJao, também é muito fácil com sed e regex estendido ( -r ):

$ sed -r 's/\s(Cc|Bb)\|...//g' file > A
$ sed -r 's/\s(Aa|Cc)\|...//g' file > B
$ sed -r 's/\s(Aa|Bb)\|...//g' file > C

Para o Os X (em sistemas Apple), a opção -r não significa o mesmo que para o GNU sed . Em particular, ele não interpreta \s corretamente como um espaço. Em vez disso, use: [[:space:]] .

Se o nome "xxx" seguindo o pipe não for sempre 3 caracteres alfanuméricos, substitua ... na regex por [^[:space:]]+ . O cutoff do nome correspondente será o primeiro espaço encontrado.

Assim, a resposta mais geral contando com sed seria para o arquivo de saída A:

$  sed -r 's/[[:space:]](Cc|Bb)\|[^[:space:]]+//g' file > A
    
por 11.09.2016 / 11:13

Tags