Combiner 2 sorties de coupe différentes en une seule commande?


15

J'ai un fichier tel que le suivant:

1234
ABCD
EFGH

Je voudrais le convertir comme suit:

2341
BCDA
FGHE

Le fichier réel contient 4 000 mots, je voudrais donc le faire de manière efficace. J'ai essayé d'utiliser la commande cut -c 2-4,1 file.txt, mais elle produit la même sortie exacte que l'entrée. Je pensais pouvoir utiliser 3 commandes différentes:

cut -c 1 file.txt > temp1.txt
cut -c 2-4 file.txt > temp2.txt
// combine the two with paste or pr

... mais je préférerais une seule commande car je dois l'exécuter plusieurs fois avec de légères modifications, donc exécuter une commande est moins sujet aux erreurs que d'exécuter 3 commandes à chaque fois.

Existe-t-il un moyen de combiner les 2 déclarations coupées en une seule? Quelque chose comme:

cut -c 1 file.txt | pr (cut -c 2-4 file.txt)

Ou existe-t-il une meilleure façon de procéder?

Réponses:


8

En utilisant sed:

sed 's:^\(.\)\(.*\):\2\1:' file.txt

2341
BCDA
FGHE

11

Avec cutet pastevous pouvez également faire un one-liner:

$ cat file
1234
ABCD
EFGH
$ paste --delimiter=''  <(cut file -c2-4) <(cut file -c1)
2341
BCDA
FGHE

+1, pour le raccourci de collage. C'est facilement compréhensible. :)
Ankit

Vous pouvez également simplement utiliser -d ''au lieu de --delimiters=''pour réutiliser les caractères de la LISTE au lieu des onglets
rubo77


3
$ cat test
1234
ABCD
EFGH
$ awk -F "" '{print $2$3$4$1}' test
2341
BCDA
FGHE

Vous pouvez changer le séparateur via "-F" en fonction de vos données et organiser l'ordre des champs de manière arbitraire.


1

Voici un moyen avec perl:

perl -F'' -lane 'print @F[1..@F], $F[0]'

Fractionnement automatique aux limites des lettres, faites-en pivoter un vers la gauche et imprimez.


0

J'ai trouvé une alternative sous forme de script:

~$ cut -c2- file.txt>file2.txt
~$ cut -c1 file.txt>file3.txt
~$ paste -d "" file2.txt file3.txt>file4.txt
~$ rm file2.txt file3.txt

Le script coupe les chaînes dans des fichiers séparés. Rejoignez ensuite un nouveau fichier (file4.txt) Et supprimez enfin les fichiers de rechange.

la solution llua est plus propre à mon goût.


-1

Avez-vous essayé rev?

~$ cat filename | rev


3
Jetez un œil à l'exemple de sortie. Ce n'est pas un pur revers, mais une bonne pensée. Si vous ne pouvez pas trouver un moyen de retravailler cela, vous devez probablement le supprimer, juste pour qu'il ne soit pas décoté et ne perturbe pas le fil.
slm
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.