Precisa pegar a 4ª palavra de uma linha e copiá-la para o início da linha (sed awk)

0

Eu tenho um arquivo com 5 milhões de linhas:

xx ss ss "abcde"

Eu preciso pegar o "abcde" e copiá-lo para o início de cada linha:

"abcde" xx ss ss "abcde"

A string "abcde" muda em cada linha, portanto, não é uma palavra específica, mas é sempre a quarta palavra em cada linha.

    
por Seif 24.05.2017 / 13:43

4 respostas

3

Um awk alternativo:

awk '{print $4,$0}' file

Teste:

$ cat file7
abc def ghi nop
klm one two three
four five six nine

$ awk '{print $4,$0}' file7
nop abc def ghi nop
three klm one two three
nine four five six nine
    
por 24.05.2017 / 14:38
1

Com sed , supondo que as colunas estejam separadas por um número de espaços e que possa haver mais comlumns:

sed 's/\([^ ]* *\)\{3\}\([^ ]*\)/ &/'

O padrão corresponde a três colunas repetidas, identificadas como espaços não seguidos por espaços, seguidos por outra coluna, referenciada como na cadeia de substituição. O & coloca toda a correspondência na substituição, então a quarta coluna é inserida antes de todo o restante da linha.

Observe que isso funcionará com mais de quatro colunas, mas falhará se não houver uma quarta coluna.

O mesmo quando o regex estendido está disponível (FreeBSD ou GNU sed ):

sed -E 's/([^ ]* *){3}([^ ]*)/ &/'
    
por 24.05.2017 / 13:48
0

Há respostas melhores aqui, mas aqui está um loop for in que também funciona:

IFS=$'\n'; for i in $(cat file); do var=$(echo $i | awk '{print $4}')  ; sed -i "s/.*$var/$var &/g" file ;done
    
por 24.05.2017 / 13:57
0

Colocamos o quarto campo $F[3] juntamente com a lista separtor $" (cujo valor padrão é space ) no início do registro / linha. A opção -p irá autoprint do registro.

perl -pale 's/^/$F[3]$"/' yourfile

Com o comando sed, salvamos uma cópia do original e delimitamos o 4º campo. Então nós tiramos a parte principal. E restabeleça o original acrescentando ao espaço padrão, que agora ocupa o quarto campo.

sed -e '
   /\n/!h
   //!s/\S\+/\n&\n/4
   /\n.*\n/D
   s/\n.*//;G;s/\n/ /
' yourfile
    
por 24.05.2017 / 18:16