Mover os últimos seis dígitos para o início dos números

2

Estou usando o Twitter para enviar notícias para um e-mail e os últimos seis campos são a data e a hora. Eu gostaria que esses fossem os primeiros seis campos. Qual é o comando no awk para mover os últimos n campos para o início da linha?

Eu tentei googling mas todos os exemplos dados assumem que cada linha tem o mesmo número de campos

exemplo:

76356378090986
08976357627980089
089723571237809209
0897253712730912838798
908916523568909887
876756467890
09876535467890
765643324343
467890876543
234567890987654
123456789009876543
54323456789876
09876543345678
123456789009876
12345678998765

resultado:

09098676356378
98008908976357627
809209089723571237
8387980897253712730912
909887908916523568
467890876756
46789009876535
324343765643
876543467890
987654234567890
876543123456789009
78987654323456
34567809876543
009876123456789
99876512345678
    
por Rui F Ribeiro 08.10.2018 / 13:44

4 respostas

7

com sed :

sed 's/\(.*\)\(.\{6\}\)//'
    
por 08.10.2018 / 13:52
5

com sed:

sed -E 's/(.*)(.{6})//'

Ou:

sed 's/\(.*\)\(.\{6\}\)//'

com o awk:

awk '{l=length-6;print(substr($0,l+1) substr($0,1,l))}'

Com o awk (GNU):

awk '{print gensub(/(.*)(.{6})/,"\2\1",1)}'
    
por 08.10.2018 / 14:05
1
cat file | sed -e 's/\(.\)/ /g' | awk '{ for (i = 1; i <= NF; i++) printf "%s" FS, $((NF-7+i) % NF+1); print ""}' | sed 's/ //g'
09098676356378
98008908976357627
809209089723571237
8387980897253712730912
909887908916523568
467890876756
46789009876535
324343765643
876543467890
987654234567890
876543123456789009
78987654323456
34567809876543
009876123456789
99876512345678
    
por 08.10.2018 / 13:53
0

Alguns perl one-liners:

  1. dividindo cada linha em caracteres:

    perl -F'' -lane 'print join "", splice(@F, -6), @F' file
    
  2. usando substrings

    perl -lpe '$_ = substr($_, -6) . substr($_, 0, $#_ - 6)' file
    
por 09.10.2018 / 02:54