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 \2
na 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 -p
opção será autoprint
o 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