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
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.
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
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}([^ ]*)/ &/'
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
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
Tags text-processing awk sed