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)
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!
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)
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