¿Combinando 2 salidas de corte diferentes en un solo comando?

15

Tengo un archivo como el siguiente:

1234
ABCD
EFGH

Me gustaría convertirlo a lo siguiente:

2341
BCDA
FGHE

El archivo real tiene 4.000 palabras, por lo que me gustaría hacer esto de manera eficiente. Intenté usar el comando cut -c 2-4,1 file.txt, pero produce el mismo resultado exacto que la entrada. Estaba pensando que podría usar 3 comandos diferentes:

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

... pero preferiría un solo comando porque necesito ejecutarlo varias veces con ligeras modificaciones, por lo que ejecutar un comando es menos propenso a errores que ejecutar 3 comandos cada vez.

¿Hay alguna forma de combinar las 2 declaraciones de corte en una? Algo como:

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

¿O hay una mejor manera de hacer esto?

Sensato
fuente

Respuestas:

8

Utilizando sed:

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

2341
BCDA
FGHE
llua
fuente
11

Con cuty pastetambién puedes hacer una frase:

$ cat file
1234
ABCD
EFGH
$ paste --delimiter=''  <(cut file -c2-4) <(cut file -c1)
2341
BCDA
FGHE
Bernhard
fuente
+1, para el atajo de pegar. Es fácilmente entendible. :)
Ankit
También puede usar en -d ''lugar de --delimiters=''reutilizar caracteres de LIST en lugar de
TABs
4

Si usa bash, use la indexación de cadena de expansión de parámetros :

while IFS= read -r word; do
  echo "${word:1:3}${word:0:1}"
done < file.txt
Glenn Jackman
fuente
3
$ cat test
1234
ABCD
EFGH
$ awk -F "" '{print $2$3$4$1}' test
2341
BCDA
FGHE

Puede cambiar el separador mediante "-F" de acuerdo con sus datos y organizar el orden de los campos de forma arbitraria.

Dejian
fuente
1

Aquí hay una manera con perl:

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

División automática en los límites de las letras, gire una hacia la izquierda e imprima.

Thor
fuente
0

Encontré una alternativa en forma 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

El script corta las cadenas en archivos separados. Luego únete a un nuevo archivo (file4.txt) y finalmente elimina los archivos de repuesto.

La solución llua es más limpia para mi gusto.

Shugendo
fuente
-1

¿Has probado rev?

~$ cat filename | rev

Karun
fuente
3
Echa un vistazo a la salida de muestra. No es un reverso puro, sino un buen pensamiento. Si no puede encontrar una manera de volver a trabajar esto, probablemente debería eliminarlo, solo para que no se rechace y confunda el hilo.
slm