Tengo un archivo con 5 millones de líneas:
xx ss ss "abcde"
Necesito tomarlo "abcde"
y copiarlo al comienzo de cada línea:
"abcde" xx ss ss "abcde"
La cadena "abcde"
cambia en cada línea, por lo que no es una palabra específica, pero siempre es la cuarta palabra en cada línea.
Respuesta1
Una alternativa awk:
awk '{print $4,$0}' file
Pruebas:
$ 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
Respuesta2
Con sed
, asumiendo que las columnas están separadas por varios espacios y podría haber columnas adicionales:
sed 's/\([^ ]* *\)\{3\}\([^ ]*\)/\2 &/'
El patrón coincide con tres columnas repetidas, identificadas como no espacios seguidas de espacios, seguidas de otra columna, a la que se hace referencia \2
en la cadena de reemplazo. Coloca &
toda la coincidencia en el reemplazo, por lo que la cuarta columna se inserta antes de que quede todo el resto de la línea.
Tenga en cuenta que esto funcionará con más de cuatro columnas, pero fallará si no hay una cuarta columna.
Lo mismo cuando hay expresiones regulares extendidas disponibles (FreeBSD o GNU sed
):
sed -E 's/([^ ]* *){3}([^ ]*)/\2 &/'
Respuesta3
Hay mejores respuestas aquí, pero aquí hay un bucle for in que también funciona:
IFS=$'\n'; for i in $(cat file); do var=$(echo $i | awk '{print $4}') ; sed -i "s/.*$var/$var &/g" file ;done
Respuesta4
Colocamos el cuarto campo $F[3]
junto con el separador de lista $"
(que por defecto es space
) al principio del registro/línea. La -p
opción será autoprint
el registro.
perl -pale 's/^/$F[3]$"/' yourfile
Con el comando sed guardamos una copia del original y vallamos el 4º campo. Luego quitamos la parte principal. Y restablezca el original agregándolo al espacio del patrón, que ahora contiene el cuarto campo.
sed -e '
/\n/!h
//!s/\S\+/\n&\n/4
/\n.*\n/D
s/\n.*//;G;s/\n/ /
' yourfile