Junta-se a todas as outras colunas com sed ou awk

4

Eu tenho um arquivo de texto grande (666000 colunas) no formato

A B C D E F

Saída desejada

AB CD EF

Como podemos fazer isso em sed ou awk . Eu tentei algumas coisas, mas nada parece estar funcionando. Por favor sugira algo.

    
por Adi 27.09.2013 / 02:20

3 respostas

3

Em sed :

sed 's! \([^ ]\+\)\( \|$\)! !g' your_file

Isso fará as substituições e imprimirá o resultado como padrão. Para modificar o arquivo, adicione a opção -i :

sed -i 's! \([^ ]\+\)\( \|$\)! !g' your_file

Explicação

Este comando sed procurará um espaço, seguido por pelo menos um caractere não espacial, seguido por um espaço ou o final da linha. Ele substitui essa sequência por qualquer caractere não espacial que tenha encontrado seguido por um único espaço. A substituição é aplicada o maior número de vezes possível ao longo da linha (isso é chamado de substituição global) porque o modificador g é fornecido no final. Então, basicamente, com uma sequência como A B C , sed encontrará o padrão "B" e substituirá por "B", deixando você com AB C como resultado final.

Suposições feitas por este código

Este código assume que os espaços entre suas colunas são realmente espaços e não TABs, por exemplo. Isso pode ser facilmente corrigido em detrimento da legibilidade:

sed 's![[:blank:]]\+\([^[:blank:]]\+\)\([[:blank:]]\+\|$\)! !g' your_file
    
por 27.09.2013 / 02:32
2
  • awk:

    awk '{printf $1$2;for(i=3; i<=NF;i+=2){printf " %s",$i$(i+1)}print}' file 
    

    Este provavelmente será o mais rápido dos dois para arquivos grandes.

  • Perl:

    perl -pe 's/([^\s]+)\s+([^\s]+)/$1$2/g' file
    
por 27.09.2013 / 02:37
0

Se o seu arquivo tiver muitas colunas, uma opção é usar o gawk para tratar cada coluna como um registro, configurando RS para "um ou mais caracteres em branco". Isso ajuda a evitar a necessidade de configurar um loop pelas colunas. Observe que essa solução é frágil diante de um número ímpar de colunas em uma linha.

awk --re-interval -v RS='[[:space:]]{1,}' '{x=$0; getline; printf x$0RT}' file
    
por 27.09.2013 / 03:15

Tags