Como posso apagar a quinta palavra de cada linha de um arquivo?

13

Eu quero excluir a quinta palavra de cada linha em um arquivo.

O conteúdo atual do arquivo:

File is not updated or and will be removed  
System will shut down f within 10 seconds  
Please save your work 55 or copy to other location  
Kindly cooperate with us D  

Resultado esperado:

File is not updated and will be removed  
System will shut down within 10 seconds  
Please save your work or copy to other location  
Kindly cooperate with us
    
por pmaipmui 14.07.2015 / 17:41

9 respostas

31

Que tal cut :

$ cut -d' ' -f1-4,6- file.txt 
File is not updated and will be removed  
System will shut down within 10 seconds  
Please save your work or copy to other location  
Kindly cooperate with us
  • -d' ' define o delimitador como espaço

  • -f1-4,6- seleciona o primeiro ao quarto campo (palavra), deixando o 5º e depois continua imprimindo do 6º para o restante.

por 14.07.2015 / 17:53
11

Uma solução com cut :

cut -d ' ' -f1-4 -f6- FILE
    
por 14.07.2015 / 17:51
6

awk: remove o quinto campo

awk '{for (i=5; i<NF; i++) $i = $(i+1); NF--};1' file

Se você deseja salvar o arquivo no local: link

Você pode simplesmente apagar o conteúdo do 5º campo, mas isso deixa 2 separadores de campo de saída consecutivos:

awk '{$5 = ""};1' file
    
por 14.07.2015 / 18:04
4

Com o POSIX sed:

sed -e 's/[^[:alnum:]_][[:alnum:]_][[:alnum:]_]*//4' <file
    
por 14.07.2015 / 17:48
2

glenn ofereceu uma solução equivalente a

awk '{$5=""; print}' file

Como ele e outros apontaram, isso

  1. cria espaços em branco iniciais e finais em todas as linhas,
  2. compacta cada string de espaços em branco (espaços e / ou tabulações) em um único espaço e
  3. deixa dois espaços entre a quarta e a sexta palavras.

Um hack para corrigir o terceiro problema é

awk '{$5=""; print}' file | sed 's/  / /'

Isso ainda deixará um ou mais espaços adicionados no final de qualquer linha que tivesse cinco palavras ou menos entrando. Se você puder identificar uma palavra que nunca aparecerá na entrada,

awk '{$5="unicorn"; print}' file | sed 's/ *unicorn//'

irá lidar com isso (mas ainda deixa os problemas 1 e 2).

    
por 15.07.2015 / 21:39
1

Perl.

perl -ne 'print $_ =~ /^(\w+ +\w+ +\w+ +\w+ +)\w+ (.*)/,"\n"' file
    
por 14.07.2015 / 21:13
1
 sed 's/^\(\([[:blank:]]*[^[:blank:]]\{1,\}\)\{4\}\)[[:blank:]]*[^[:blank:]]*//' YourFile > Output.txt
  • posix sed baseado no separador de espaço / tabulação (meta class [: blank:]])
  • manter o espaço seguinte após a quinta palavra, mas removendo a anterior

Um mais robusto (o sed tem o padrão mais longo possível e o padrão com * pode falhar a separação ou a palavra na primeira versão), mas uma versão um pouco mais longa

sed 's/^\([[:blank:]]*\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{4\}\[^[:blank:]]\{1,\}//' YourFile > Output.txt
    
por 16.07.2015 / 10:56
1

Outra possibilidade, assumindo o corte do GNU:

cut -d' ' -f5 --complement file.txt
    
por 16.07.2015 / 20:24
-1

Usando Perl > 5.10 (e com sucesso a saída de todas linhas: 0)): -

perl -nE '/^((\w+ +){4})\w+ *(.*)/; say $1.$3' file
    
por 16.07.2015 / 15:39