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