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

14

Eu tenho um arquivo como o seguinte:

1234
ABCD
EFGH

Gostaria de convertê-lo para o seguinte:

2341
BCDA
FGHE

O arquivo atual tem 4.000 palavras, então eu gostaria de fazer isso de maneira eficiente. Eu tentei usar o comando cut -c 2-4,1 file.txt , mas ele produz a mesma saída exata da entrada. Eu estava pensando que poderia 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 eu preciso rodá-lo várias vezes com pequenas modificações, então rodar um comando é menos propenso a erros do que rodar 3 comandos a cada 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 isso?

    
por Senseful 03.09.2012 / 19:56

7 respostas

8

Usando sed :

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

2341
BCDA
FGHE
    
por 03.09.2012 / 20:26
11

Com cut e paste , você também pode fazer uma única linha:

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

Se você usar o bash, use a indexação de strings de expansão de parâmetros :

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

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

    
por 04.09.2012 / 09:00
1

Aqui está uma maneira com perl :

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

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

    
por 04.09.2012 / 10:48
0

Eu encontrei uma alternativa em um 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. Então junte-se a um novo arquivo (file4.txt) E, finalmente, remove os arquivos de reposição.

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

    
por 03.09.2012 / 20:48
-1

Você já tentou rev?

~$ cat filename | rev

    
por 23.08.2013 / 04:30