como remover as duas últimas "-delimited strings de cada linha em um arquivo grande

1

Tenho inúmeros arquivos delimitados por espaço de 2 GB de um sistema de origem. Cada linha em cada arquivo contém o mesmo número de strings envolvidas por "qualificadores de texto.

Eu preciso eliminar as duas últimas seqüências de caracteres e seus qualificadores de texto de cada linha de cada arquivo. (como remover as duas últimas colunas de um relatório colunar). Com arquivos menores, posso importar para o Excel, delimitar, excluir as colunas, salvar como delimitado por tabulações (muito mais útil que espaços).

Anycase, esses arquivos são muito grandes e possuem muitas linhas para o Excel. Então sed ??

"text1" "text2" "text3" "text4" "text5" "text6"

Cada linha tem o mesmo número de strings. Como eu derrubo "text5" "text6" de cada linha?

    
por user231894 18.05.2017 / 03:19

3 respostas

2

Este comando sed removerá as últimas duas cadeias separadas por espaços, citadas no final de cada linha do arquivo infile e enviará os resultados para outfile :

sed 's/ *"[^"]*" *"[^"]*" *$//' < infile > outfile
    
por 18.05.2017 / 03:38
2

Se você sabe que sempre deseja excluir as duas últimas colunas, essa expressão pode ser usada:

awk 'NF-=2' file

Percebi que isso não funciona com nawk , não sei por quê. A maneira portátil é forçar a divisão do campo com '$ 1 = $ 1:

awk '{NF-=2} $1=$1' file

Saída:

"text1" "text2" "text3" "text4"
    
por 18.05.2017 / 07:08
1
awk '{$(NF-1)=$NF=""}1'  inp

perl -pale '$_ = "@F[0..@F-3]"' inp

sed -ne '
   s/" "/"\
"/g
   :a
   s/\n/ /
   /\n.*\n.*\n/ba
   P
' inp

Explicação:

  • awk code anula os últimos e os últimos campos e impressões.
  • Em perl , os campos são armazenados em @F array e os slice de 0 até o terceiro e último são selecionados e armazenados na linha atual $_ . As aspas duplas existem para efetuar o xformation de cadeia de caracteres > e unidas pelo $" superglobal cujo valor padrão é um espaço. A opção -p Perl, em seguida, carrega o valor $_ para a stdout.
  • Em sed , primeiro transformamos todos os padrões em " " --- > "\n" , em seguida, entramos em um loop onde recuperamos o \n até restarem dois. Em que ponto de tempo usamos o comando P uppercase p, para imprimir a primeira parte do espaço padrão.
por 18.05.2017 / 05:53