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?

Sensé
la source

Réponses:

8

En utilisant sed:

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

2341
BCDA
FGHE
llua
la source
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
Bernhard
la source
+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
4

Si vous utilisez bash, utilisez l'indexation de chaîne de l' expansion des paramètres :

while IFS= read -r word; do
  echo "${word:1:3}${word:0:1}"
done < file.txt
glenn jackman
la source
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.

Dejian
la source
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.

Thor
la source
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.

Shugendo
la source
-1

Avez-vous essayé rev?

~$ cat filename | rev

Karun
la source
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