Awk: remova os primeiros campos do CSV

1

Estou usando este comando para obter minha saída em csv.

awk 'ORS="," {print $2}'

Eu obtenho a saída no seguinte formato:

a,b,c,name,col1,col2,col3,

Aqui, gostaria de excluir 'name' e tudo antes de 'name' e obter apenas os nomes das colunas. Note que os nomes das colunas também podem ter o nome do trabalho, o qual eu não quero deletar. Então, estou bem apenas com a exclusão da primeira ocorrência do nome. Isso pode ser feito com o awk?

Eu tentei:

awk 'NR >4 {print $2}' | awk '{ORS=","}'

e várias combinações, nenhuma das quais funcionou.

    
por user2441441 10.01.2018 / 20:29

2 respostas

3

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 .

    
por 10.01.2018 / 20:46
3

Assumindo o conteúdo do arquivo conforme abaixo:

$ cat myfile
a,b,c,name,col1,col2,col3,forename,surname,name5,foo,name,name6
$ 

awk solution

$ awk -F',name,' '{print substr($0,index($0,$2))}' myfile
col1,col2,col3,forename,surname,name5,foo,name,name6
$

perl solution.

$ perl -pe 's/^.*?name,//' myfile
col1,col2,col3,forename,surname,name5,foo,name,name6
$
    
por 10.01.2018 / 21:41