Что ж, давайте разобьем это на простые шаги:
#!/bin/bash
# First, let's get that file's name:
FILE=$(ls -rt ORIGFILE*.txt | tail -n1)
if [[ 0 -ne $? ]]; then
echo "Unable to locate matching file. Aborting." 1>&2
exit 1
fi
# Now, create a new file containing the file's name:
echo "$FILE" > NEWFILE.TXT
# And append the contents of the old file into the new:
cat "$FILE" >> NEWFILE.TXT
# Finally, get rid of the old file: (uncomment if you're sure)
# rm "$FILE"
$ sed 's/[^|]*modesc=\([^ ]*\).*$/\1/' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123
Esto usa sed
para reemplazar todo el último campo con el contenido después de modesc=
hasta el siguiente espacio.
$ awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(".*", "", $3)} 1' file
abc|123|bpp123
abc|123|pmk123
abc|123|pnj123
Este awk
programa modifica la tercera columna con dos sustituciones. El primero elimina todo hasta modesc=
inclusive, y el segundo elimina todo después del primer espacio restante. El solitario 1
al final hará que awk
imprima el registro modificado (que puede ser reemplazado por{ print }
).
Para solo obtener la cadena después de modesc=
de la tercera columna de los datos originales (y nada más ), puede usar cualquiera de los comandos anteriores y luego canalizarlo cut -d '|' -f3
, o puede usar
sed 's/.*modesc=\([^ ]*\).*$/\1/' file
o
awk -F '|' -vOFS='|' '{ sub(".*modesc=", "", $3); sub(".*", "", $3); print $3 }' file
Usandoawk
:
awk -F\| '{print $1"|"$2"|"gensub(/modesc=(.*).*$/,"\\1","g",$3)}' /tmp/file.log
Con awk
puede usar delimitadores de multiplicación y hacerlo bastante muestra:
awk -F'[|= ]' ' {print $1"|" $2"|" $5}' /tmp/file.log
En la tubería de línea anterior |
, el signo de equivalencia =
y el espacio son delimitadores.
Puede definir el delimitador de salida explícitamente así:
awk -F'[|= ]' 'BEGIN { OFS="|"} {print $1,$2,$5}' /tmp/file.log
Esto será menos eficiente, pero la tarea encaja muy bien con cut
ypaste
paste -d '|' <(cut -d'|' -f1-2 file.log) <(cut -d'|' -f3 file.log | grep -oP 'modesc=\K\S+')