Comando de corte con palabra como delimitador

10

¿Hay algún comando de corte para cortar basado en una palabra, por ejemplo:

171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD. The task has terminated abnormally because of a program check. 16:08:27

Quiero la salida como:

171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

¿Cómo acercarse?

Anonimo
fuente
1
¿A qué palabra te refieres?
Cyrus
ABCD es la palabra que quiero usar como delimitador. Y también, este es un registro, y al igual que ABCD, también tengo otras palabras clave. Quiero un enfoque en general
Anony

Respuestas:

16

Yo sugiero:

awk -F 'ABCD' '{print $1 FS "."}' file

Salida:

171212 16082784 6264 XXX xxxxxxxx Transacción XXXXX anular ABCD.

FScontiene su delimitador "ABCD". "ABCD" es una expresión regular.

Ciro
fuente
4

awkpuede hacer el trabajo si proporciona una -Fmarca con la palabra que desea usar:

$ awk -F 'test'  '{print $1;print $2}'  <<<  "onetesttwotest"                                                            
one
two

En su caso particular, eso sería:

$ awk -F 'ABCD' '{print $1,FS}' input.txt                                                                                
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend  ABCD

A juzgar por su ejemplo, solo está tratando de imprimir cosas, por ABCDlo que eliminar todo después de eso también es una opción:

$ awk '{print substr($0,0,match($0,/ABCD/)+4);}' input.txt                                                               
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.
Sergiy Kolodyazhnyy
fuente
También quieren mantener el 'ABCD'.
Sí ... ABCD debe estar allí
Anony
Sugiero awk '{print gensub(/(.*ABCD\.).*/,"\\1",1)}'.
postre
2

grep solución:

grep -o '^.*ABCD\.' input.txt

La expresión regular coincidirá con cada línea que comienza ^con cualquier carácter .repetido varias veces *y termina con la cadena. ABCD.La barra diagonal inversa \escapa al significado especial del punto .al final.

La opción -ole dirá al grepcomando para imprimir sólo las partes coincidentes (no vacío) de una línea coincidente.

pa4080
fuente
2

cutpuede en sí mismo realizar este trabajo. No se basa en una palabra, sino en .delimitador.

Utilizar :

cut -f 1 -d '.' input.txt | xargs -I "%" echo %.

Salida

rooney@bond-pc:~$ cat input.txt 
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD. The task has terminated abnormally because of a program check. 16:08:27
rooney@bond-pc:~$ 
rooney@bond-pc:~$ cut -f 1 -d '.' input.txt | xargs -I "%" echo %.
171212 16082784       6264 XXX     xxxxxxxx Transaction XXXXX abend ABCD.

xargsse usa aquí solo para agregar .al final de la cadena ABCD.

Rooney
fuente