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

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

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

A B C D E F

Saída desejada

AB CD EF

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

Responder1

Em sed:

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

Isso fará as substituições e imprimirá o resultado para padronizar. Para modificar o arquivo no local, adicione a -iopção:

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

Explicação

Este sedcomando procurará um espaço, seguido por pelo menos um caractere que não seja espaço, seguido por um espaço ou o final da linha. Ele substitui essa sequência por quaisquer caracteres não espaciais encontrados, seguidos por um único espaço. A substituição é aplicada tantas vezes quanto possível ao longo da linha (isso é chamado de substituição global) porque o gmodificador é fornecido no final. Então, basicamente, com uma sequência como A B C, sedvocê encontrará o padrão "B" e substituirá por "B" deixando-o AB Ccomo 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:]]\+\|$\)!\1 !g' your_file

Responder2

  • estranho:

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

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

  • Perl:

    perl -pe 's/([^\s]+)\s+([^\s]+)/$1$2/g' file
    

Responder3

Se o seu arquivo realmente tiver tantas colunas, uma opção é usar o gawk para tratar cada coluna como um registro, definindo RScomo "um ou mais caracteres de espaço em branco". Isso ajuda a evitar a necessidade de configurar um loop nas colunas. Observe que esta 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

informação relacionada