Combinando 2 saídas de corte diferentes em um único comando?

15

Eu tenho um arquivo como o seguinte:

1234
ABCD
EFGH

Gostaria de convertê-lo para o seguinte:

2341
BCDA
FGHE

O arquivo real tem 4.000 palavras, então eu gostaria de fazer isso de maneira eficiente. Tentei usar o comando cut -c 2-4,1 file.txt, mas ele produz a mesma saída exata que a entrada. Eu estava pensando em 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

... mas eu preferiria um único comando porque preciso executá-lo várias vezes com pequenas modificações, portanto, executar um comando é menos propenso a erros do que executar 3 comandos por vez.

Existe alguma maneira de combinar as duas instruções de corte em uma? Algo como:

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

Ou há uma maneira melhor de fazer isto?

Sensível
fonte

Respostas:

8

Usando sed:

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

2341
BCDA
FGHE
llua
fonte
11

Com cute pastevocê também pode fazer uma linha:

$ cat file
1234
ABCD
EFGH
$ paste --delimiter=''  <(cut file -c2-4) <(cut file -c1)
2341
BCDA
FGHE
Bernhard
fonte
+1, para o atalho de colagem. É facilmente compreensível. :)
Ankit
Você também pode usar -d '' em vez de --delimiters=''reutilizar personagens da lista em vez de OAT
rubo77
4

Se você usar o bash, use a indexação de string da expansão de parâmetro :

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

Você pode alterar o separador via "-F" de acordo com seus dados e organizar a ordem dos campos arbitrariamente.

Dejian
fonte
1

Aqui está uma maneira de perl:

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

Divida automaticamente nos limites das letras, gire um para a esquerda e imprima.

Thor
fonte
0

Eu encontrei uma alternativa em uma maneira 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

O script corta as cadeias em arquivos separados. Em seguida, junte-se a um novo arquivo (file4.txt) e, finalmente, remova os arquivos sobressalentes.

a solução llua é mais limpa para o meu gosto.

Shugendo
fonte
-1

Você já tentou rev?

~$ cat filename | rev

Karun
fonte
3
Dê uma olhada na saída de amostra. Não é um puro reverso, mas um bom pensamento. Se você não conseguir encontrar uma maneira de refazer o trabalho, provavelmente deve excluí-lo, apenas para que não seja votado negativamente e confunda o encadeamento.
slm