Como usar o Unix Shell para mostrar apenas as primeiras n colunas e as últimas n colunas?

3

Eu tenho muitos arquivos csv. O design original deveria ter cinco colunas.

Acabei de descobrir que a coluna do meio do arquivo csv tem uma string com um número arbitrário de vírgulas e não é citada corretamente. Isso leva a linhas com um número arbitrário de colunas.

Como faço para obter apenas as duas primeiras e últimas duas colunas desses arquivos csv?

Como o número de vírgulas pode mudar de linha para linha, preciso especificar as duas primeiras e as últimas duas colunas.

    
por PoorLifeChoicesMadeMeWhoIAm 23.01.2018 / 19:56

3 respostas

13
awk -F, '{print $1, $2, $(NF-1), $NF}'  < input

Mais geralmente (por título da pergunta), para imprimir a primeira e a última coluna n da entrada - sem verificar se isso significa imprimir algumas colunas duas vezes -

awk -v n=2 '{ 
  for(i=1; i <= n && i <= NF; i++)
      printf "%s%s", $i, OFS
    for(i=NF-n+1; i <= NF && i >= 1; i++)
      printf "%s%s", $i, OFS
    printf "%s", ORS
  }' < input

(usando -F conforme necessário para o delimitador)

    
por 23.01.2018 / 20:07
1

perl:

echo a,b,X,X,X,X,c,d | perl -F, -slane 'print join ",", @F[0..$n-1, -$n..-1]' -- -n=2
a,b,c,d
    
por 25.01.2018 / 20:06
1

Você também pode usar este sed

sed -E 's/(([^,]*,){2}).*((,[^,]*){2})//;s/,,/,/'
    
por 27.01.2018 / 13:22

Tags