J'ai un fichier avec des colonnes. Voir ci-dessous pour un exemple:
a b c ... z
1 2 3 ... 26
Je voudrais permuter toutes les colonnes où la 1ère devient la dernière, la seconde devient l'avant-dernière ... etc.
z y x ... a
26 25 24 ... 1
Y a-t-il une doublure ( awk
ou sed
) qui fait cela?
Je sais que l'on peut utiliser awk
quand il n'y a que quelques colonnes, mais j'aimerais pouvoir le faire sur des fichiers avec des milliers de colonnes.
tac
fait cela parfaitement pour les lignes.
Je suppose que je cherche l'équivalent pour les colonnes.
rev
n'a pas fonctionné pour moi, car il échange également le contenu de la colonne.
text-processing
sed
awk
columns
user22519
la source
la source
perl -lane 'print join " ", reverse @F'
Réponses:
la source
Vous pouvez le faire avec un petit script python:
la source
Si cela ne vous dérange pas python, cette ligne inversera l'ordre des colonnes séparées par des espaces dans chaque ligne:
Ce qui précède fonctionne également avec python2.7:
la source
Utilisation à sens unique
awk
.Contenu de
infile
:Exécutez la
awk
commande suivante :Avec le résultat suivant:
la source
C'est lent, mais il a une fonction de rachat. Il conserve la largeur des séparateurs de champ, lorsqu'ils sont plus larges qu'un seul caractère. FWIW: Si vous exécutez ce script deux fois, le résultat est identique à l'original.
Voici le script.
Voici quelques comparaisons temporelles. Le fichier de test contenait 1 ligne.
la source
Vous pouvez utiliser
tac
vous avez juste besoin de transposer l'entrée avant et après. Cela peut être fait avec le calculateur de feuille de calculsc
et son acolytepsc
:Comme on le voit ici .
Cela fonctionne mieux lorsque toutes les colonnes sont remplies.
dans le fichier
outfile
Éditer
Comme indiqué par PeterO
sc
a une limite stricte de 702 colonnes, c'est donc la taille maximale prise en charge par cette méthode.la source
1
->1.00
. De plus, j'obtiens des erreurs pour les lignes de plus de 702 champs de large. Il semble être lié à une limite numérique de 32768 ... mais c'est assez rapide, asis.-S
à lapsc
commande devrait tout interpréter comme des chaînes. En ce qui concerne la limite de 702 colonnes, c'est une limite stricte car seules les colonnes A à ZZ sont prises en charge (26 + 26 * 26), je vais ajouter un commentaire à ce sujet.Ce pipeline est plus rapide que l'autre réponse la plus rapide d'un facteur significatif (voir les résultats). Il utilise
tr
ettac
. Il doit utiliser 2 octets ASCII (\ x00- \ x7F) qui n'existent pas dans vos données.\x00
est généralement un bon choix,\x01
mais vous pouvez utiliser n'importe quel octet ASCII qui ne figure pas dans les données.Dans cet exemple, ESPACE et TAB comme caractères de délimitation. Les délimiteurs peuvent être multi-octets ou simples. Le délimiteur de sortie est un espace unique.
Voici la commande. Le nom de fichier montre le
numberof fields
_xnumber of lines
Si vous voulez / devez vérifier les octets inutilisés, vous pouvez vérifier au préalable avec ce
awk
script facultatif . Le temps global, même lors de l'exécution de ce script facultatif, est encore beaucoup plus rapide que les autres métodes (jusqu'à présent :) .. Voici le script de prétraitement.Voici le script awk:
char-ascii-not-in-stream
Le deuxième ensemble de temps, pour ce script, inclut
char-ascii-not-in-stream
le temps de.la source
Vous pouvez également le faire sans imprimer f :
la source