3 votos

Automator Shell script - grep y variables - extraer y combinar texto

Estoy intentando crear una acción de carpeta de Automator que haga lo siguiente cuando varios se trasladan a ella. Cada fichero tiene el mismo formato (TextA es siempre el mismo; StringA y B son diferentes para cada fichero). Pero los datos que quiero también están duplicados en cada fichero, y sólo quiero una instancia de ellos:

File1.txt

TextAfile1 StringAfile1
TextBfile1 StringBfile1
TextAfile1 StringAfile1
TextBfile1 StringBfile1

Un ejemplo real del texto sería:

File1.txt

The delivery of TitleA
The barcode for this is 1234
The delivery of TitleA
The barcode for this is 1234

File2.txt

The delivery of TitleB
The barcode for this is 5678
The delivery of TitleB
The barcode for this is 5678

Hasta ahora, mi flujo en Automator es el siguiente (la acción Carpeta recibe los archivos añadidos a la Carpeta):

  1. Ejecutar Shell script (mostrar 2 líneas de texto que empiecen por "TextoA" y "TextoB")

    grep -i 'The delivery of' "$@" grep -i 'The barcode' "$@"

  2. Nuevo archivo de texto (txt sin formato)

  3. Recorrer todos los archivos (parece que Automator lo hace automáticamente)

  4. Ejecutar Shell script (Borra "TextoA" y TextoB del principio de todas las líneas para que todas empiecen con el texto CadenaA que sigue inmediatamente)

    sed -e "s/The delivery of //g" "$@"
    sed -e "s/The barcode for this is //g" "$@"
  5. Ejecutar Shell script (ordenar alfabéticamente)

    cat "$@" | sort

El archivo de texto resultante debería tener este aspecto:

TitleA 1234
TitleB 5678
...
TitleZ ####

Ahora mismo estoy recibiendo esto (sin comillas):

"/users/path/to/file1.txt:The delivery of TitleA"
"/users/path/to/file1.txt:The delivery of TitleA"
"/users/path/to/file2.txt:The delivery of TitleB"
"/users/path/to/file2.txt:The delivery of TitleB"

"/users/path/to/file1.txt:The barcode for this is 1234"
"/users/path/to/file1.txt:The barcode for this is 1234"

"/users/path/to/file2.txt:The barcode for this is 5678"
"/users/path/to/file2.txt:The barcode for this is 5678"

Intento borrar la ruta, borrar el texto anterior y eliminar los duplicados. Así que idealmente voy a terminar con:

TitleA 1234
TitleB 5678

Además, el archivo txt final se ordenaría alfabéticamente. Pero podría conformarme con pegarlo en Excel y ordenarlo allí, etc. aunque ordenar en script sería mejor si no es demasiado difícil.

¿Voy por buen camino? He probado todas las combinaciones diferentes de este flujo de trabajo y me parece que tiene un fallo fundamental.

3voto

sed no es muy adecuado para el tratamiento multilínea, pero es fácil de lograr con awk :

$ awk '/^The delivery of/ { title = $4 }
       /^The barcode for/ { print title, $6 }' File1.txt File2.txt | sort -u
TitleA 1234
TitleB 5678

Para integrar esto en una Acción de Carpeta, cree un flujo de trabajo de Acción de Carpeta de Automator con una acción "Ejecutar Shell script".

enter image description here

No has descrito qué quieres hacer con la salida, así que captúrala con una acción adicional o añade > ~/my-output.txt para almacenarlo en su directorio de usuario.

2voto

Michael Zhou Puntos 167

El sistema operativo viene con un montón de pequeñas herramientas que manipulan el texto. En este ejemplo encadenamos rev (invertir), cortar, pegar y ordenar con tuberías.

rev file1.txt file2.txt | cut -d' ' -f1 | rev | paste -d' ' - - | sort -u
  • rev invierte cada línea de texto de los archivos
  • cut coge el primer "campo" de texto de cada línea
  • rev invierte de nuevo el texto de la salida de cut
  • paste pega cada dos líneas en una sola
  • sort elimina duplicados

Esta solución es sólo una demostración y sería mejor hacerla con awk o perl

1voto

Mockman Puntos 16

Creo que estás viendo esos resultados porque estás trabajando con los archivos de texto además de con su contenido.

No tengo interés en trabajar con acciones de carpetas pero si añades las siguientes acciones a una nueva acción de carpeta deberían funcionar con archivos de texto cuando se añadan a la carpeta.

  • Combinar archivos de texto - combina los ocho párrafos de los dos archivos.

  • Ejecutar shell script - sed -e 's/The delivery of //g' -e 's/The barcode for this is //g' Elimina las dos cadenas especificadas

  • Ejecutar shell script - sort -u Ordena los resultados y elimina las líneas duplicadas

  • Ejecutar applescript - Empareja el título con el código de barras

    on run {input, parameters} set paraList to items of input set paraLength to ((length of paraList) / 2) set output to {} repeat with x from 1 to paraLength set end of output to item (x + paraLength) of paraList & space & item x of paraList end repeat return output end run --> {"TitleA 1234", "TitleB 5678"}

  • Nuevo documento TextEdit - debe depositar el texto deseado en un nuevo documento

    TitleA 1234 TitleB 5678

Para qué sirve:

La primera acción recoge el texto (en forma de párrafos) de los ficheros añadidos. El primer shell script ejecuta dos sed que eliminan las cadenas no deseadas. El segundo shell script ordena el texto restante y sus -u elimina las líneas duplicadas.

La acción ejecutar applescript básicamente divide los artículos en dos grupos, los recorre en bucle y empareja los títulos y los códigos de barras. Finalmente, los resultados se depositan en un nuevo documento de texto. Si se depositan documentos adicionales a la vez que sigan el mismo formato, deberían reflejarse en los resultados.

NB para propósitos de prueba, he utilizado un flujo de trabajo que contiene las acciones anteriores, pero con lo siguiente en la parte superior para alimentar 'archivo1.txt', etc a la acción 'combinar'.

  • Obtener los elementos seleccionados del buscador - los dos (o más) archivos de texto

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X