Se a,b,c,name,col1,col2,col3,
for o segundo campo de cada linha no original, você poderá fazer o teste em relação a name
ao mesmo tempo em que seleciona esses dados (isso ainda deixa a irritante vírgula final):
$ awk -vORS=, 'p {print $2}; $2 == "name" {p=1} ' input; echo
col1,col2,col3,
Então, começando com o que você tinha ( awk 'ORS="," {print $2}'
), adicionamos uma variável de teste p
que informa se name
já foi visto. Somente imprimiremos o segundo campo se p
tiver sido definido como um valor verdadeiro antes e definido como verdadeiro se o segundo campo for name
. Com os testes nesta ordem, a coluna name
em si não é impressa. Poderíamos também ignorar as linhas vazias na entrada alterando p {print $2}
para $0 && p {print $2}
, isto é, tornar uma linha de entrada vital (não vazia) uma condição para a impressão, junto com p
.
Assumi aqui que a entrada original é assim:
x a
x b
x c
x name
x col1
x col2
x col3
Como alternativa, a partir da lista separada por vírgula a,b,c,name,somename,othername,col3,
:
$ echo 'a,b,c,name,somename,othername,col3,' |
sed -e 's/.*,name,//' -e s'/,$//'
somename,othername,col3
Observe as vírgulas em ambos os lados de ,name,
no padrão, elas mantêm o greedy .*
de capturar os nomes posteriores que terminam em ...name
.