Eu tenho um arquivo com colunas. Veja abaixo um exemplo:
a b c ... z
1 2 3 ... 26
Gostaria de trocar todas as colunas onde a primeira se torna a última, a segunda se torna a antes da última ... etc ..
z y x ... a
26 25 24 ... 1
Existe um liner ( awk
ou sed
) que faz isso?
Eu sei que é possível usar awk
quando há apenas algumas colunas, mas eu gostaria de poder fazer isso em arquivos com milhares de colunas.
tac
faz isso perfeitamente para linhas.
Acho que estou procurando o equivalente para colunas.
rev
não funcionou para mim, pois também troca o conteúdo da coluna.
text-processing
sed
awk
columns
user22519
fonte
fonte
perl -lane 'print join " ", reverse @F'
Respostas:
fonte
Você pode fazer isso com um pequeno script python:
fonte
Se você não se importa com o python, esse liner inverterá a ordem das colunas separadas por espaço em todas as linhas:
O acima funciona com python2.7 também:
fonte
Uma maneira de usar
awk
.Conteúdo de
infile
:Execute o seguinte
awk
comando:Com o seguinte resultado:
fonte
Isso é lento, mas possui um recurso de resgate. Ele mantém a largura dos separadores de campo, quando eles são maiores que um único caractere. FWIW: Se você executar este script duas vezes, o resultado será idêntico ao original.
Aqui está o script.
Aqui estão algumas comparações de tempo. O arquivo de teste continha 1 linha.
fonte
Você pode usar,
tac
basta transpor a entrada antes e depois. Isso pode ser feito com a calculadora da planilhasc
e seu parceiropsc
:Como visto aqui .
Isso funciona melhor quando todas as colunas são preenchidas.
no arquivo
superar
Editar
Conforme observado por PeterO
sc
, o limite máximo é de 702 colunas, portanto esse é o tamanho máximo suportado por esse método.fonte
1
->1.00
. Além disso, recebo erros para linhas com mais de 702 campos de largura. Parece estar relacionado a um limite numérico de 32768 ... mas é bastante rápido, também.-S
aopsc
comando deve interpretar tudo como seqüências de caracteres. Com relação ao limite de 702 colunas, esse é um limite rígido, porque apenas as colunas A a ZZ são suportadas (26 + 26 * 26), acrescentarei um comentário sobre isso.Esse pipeline é mais rápido que a outra resposta mais rápida por um fator significativo (consulte os resultados). Ele usa
tr
etac
. Ele precisa utilizar 2 bytes ASCII (\ x00- \ x7F) que não existem nos seus dados.\x00
normalmente é uma boa escolha, assim como\x01
mas você pode usar qualquer byte ASCII que não esteja nos dados.Neste exemplo, ESPAÇO e TAB como os caracteres delimitadores. Os delimitadores podem ser de vários bytes ou únicos. O delimitador de saída é um espaço único.
Aqui está o comando. O nome do arquivo mostra o
numberof fields
_xnumber of lines
Se você deseja / precisa verificar os bytes não utilizados, pode verificar previamente com este
awk
script opcional . O tempo total, mesmo ao executar este script opcional, ainda é significativamente mais rápido que outros métodos (até agora :) .. Aqui está o script de pré-processamento.Este é o script awk:
char-ascii-not-in-stream
O segundo conjunto de horários, para esse script, inclui
char-ascii-not-in-stream
o horário.fonte
Você também pode fazer isso sem imprimir f :
fonte