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 sed
ou 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 -i
opção:
sed -i 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file
Explicação
Este sed
comando 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 g
modificador é fornecido no final. Então, basicamente, com uma sequência como A B C
, sed
você encontrará o padrão "B" e substituirá por "B" deixando-o 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:]]\+\|$\)!\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 RS
como "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