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

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

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

xx ss ss "abcde"

Preciso pegar "abcde"e copiar para o início de cada linha:

"abcde" xx ss ss "abcde"

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

Responder1

Uma alternativa awk:

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

Responder2

Com sed, assumindo que as colunas estão separadas por vários espaços e pode haver colunas adicionais:

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

O padrão corresponde a três colunas repetidas, identificadas como não-espaços seguidas de espaços, seguidas por outra coluna, referenciada como \2na string de substituição. O &coloca toda a correspondência na substituição, de modo que a quarta coluna é inserida antes de todo o resto da linha.

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

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

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

Responder3

Existem 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

Responder4

Colocamos o 4º campo $F[3]junto com o separador de lista $"(cujo padrão é space) no início do registro/linha. A -popção será autoprinto registro.

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

Com o comando sed salvamos uma cópia do original e cercamos o 4º campo. Então retiramos a parte principal. E restabeleça o original anexando ao espaço padrão, que agora contém o quarto campo.

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

informação relacionada