uso textuales simples rae inglesas ejemplos dobles comillas citas linux unix sed awk grep

linux - textuales - Obtener palabra entre comillas



uso de comillas rae (6)

Tengo x líneas como esta:

Unable to find latest released revision of ''CONTRIB_046578''.

Y necesito extraer la palabra entre la revision of '' y '' en este ejemplo, la palabra CONTRIB_046578 y si es posible contar el número de ocurrencias de esa palabra usando grep , sed o cualquier otro comando?


Aquí hay un script awk que puede usar para extraer y contar la frecuencia de cada palabra en comillas simples:

awk ''{for (i=1; i<=NF; i++) {if ($i ~ /^''"''.*?''"''/ ) cnt[$i]++;}} END {for (a in cnt) {b=a; gsub(/''"''"''/, "", b); print b, cnt[a]}}'' infile

PRUEBAS

cat infile Unable to find latest released revision of ''CONTRIB_046572'' Unable to find latest released revision of ''CONTRIB_046578'' Unable to find latest released revision of ''CONTRIB_046579'' Unable to find latest released revision of ''CONTRIB_046570'' Unable to find latest released revision of ''CONTRIB_046579'' Unable to find latest released revision of ''CONTRIB_046572'' Unable to find latest released revision of ''CONTRIB_046579''

SALIDA:

awk ''{for (i=1; i<=NF; i++) {if ($i ~ /^''"''.*?''"''/ ) cnt[$i]++;}} END {for (a in cnt) {b=a; gsub(/''"''"''/, "", b); print b, cnt[a]}}'' infile CONTRIB_046579 3 CONTRIB_046578 1 CONTRIB_046570 1 CONTRIB_046572 2


La solución más limpia es con grep -Po "(?<='')[^'']+(?='')"

$ cat file Unable to find latest released revision of ''CONTRIB_046578'' Unable to find latest released revision of ''foo'' Unable to find latest released revision of ''bar'' Unable to find latest released revision of ''CONTRIB_046578'' # Print occurences $ grep -Po "(?<='')[^'']+(?='')" file CONTRIB_046578 foo bar CONTRIB_046578 # Count occurences $ grep -Pc "(?<='')[^'']+(?='')" file 4 # Count unique occurrences $ grep -Po "(?<='')[^'']+(?='')" file | sort | uniq -c 2 CONTRIB_046578 1 bar 1 foo


Suposiciones

  • Cada palabra puede ocurrir varias veces, y OP quiere contar el número de ocurrencias de cada palabra.
  • No hay otras líneas en el archivo

Fichero de entrada:

$ cat test.txt Unable to find latest released revision of ''CONTRIB_046578''. Unable to find latest released revision of ''CONTRIB_046572''. Unable to find latest released revision of ''CONTRIB_046579''. Unable to find latest released revision of ''CONTRIB_046570''. Unable to find latest released revision of ''CONTRIB_046572''. Unable to find latest released revision of ''CONTRIB_046578''.

Script de Shell para filtrar y contar las palabras:

$ sed "s/.*''/(.*/)''.*//1/" test.txt | sort | uniq -c 1 CONTRIB_046570 2 CONTRIB_046572 2 CONTRIB_046578 1 CONTRIB_046579


Todo lo que necesitas es un script awk muy simple para contar las ocurrencias de lo que hay entre las comillas:

awk -F/' ''{c[$2]++} END{for (w in c) print w,c[w]}'' file

Usando el archivo de entrada de prueba de @anubhava:

$ cat file Unable to find latest released revision of ''CONTRIB_046572'' Unable to find latest released revision of ''CONTRIB_046578'' Unable to find latest released revision of ''CONTRIB_046579'' Unable to find latest released revision of ''CONTRIB_046570'' Unable to find latest released revision of ''CONTRIB_046579'' Unable to find latest released revision of ''CONTRIB_046572'' Unable to find latest released revision of ''CONTRIB_046579'' $ $ awk -F/' ''{c[$2]++} END{for (w in c) print w,c[w]}'' file CONTRIB_046578 1 CONTRIB_046579 3 CONTRIB_046570 1 CONTRIB_046572 2


sed ''s/.*/'(.*?)/'.*/$1/'' myfile.txt


Si el archivo de prueba a continuación es representativo del archivo en el problema real, entonces lo siguiente puede ser útil.

Sobre la base de que cada línea en el archivo de prueba es homogénea , es decir, bien formateada y que contiene 8 columnas (o campos), una solución práctica que utiliza el comando de cut sería la siguiente:

archivo:

Unable to find latest released revision of ''CONTRIB_046572'' Unable to find latest released revision of ''CONTRIB_046578'' Unable to find latest released revision of ''CONTRIB_046579'' Unable to find latest released revision of ''CONTRIB_046570'' Unable to find latest released revision of ''CONTRIB_046579'' Unable to find latest released revision of ''CONTRIB_046572'' Unable to find latest released revision of ''CONTRIB_046579''

Código:

cut -d '' '' -f 8 file | tr -d "''" | sort | uniq -c

Salida:

1 CONTRIB_046570 2 CONTRIB_046572 1 CONTRIB_046578 3 CONTRIB_046579

Nota sobre el código: el delimitador predeterminado utilizado por cut para separar cada campo es tab , pero como requerimos que el delimitador sea un espacio único para separar cada campo, especificamos la opción -d '' '' . El resto del código es similar a otras respuestas, así que no repetiré lo que se ha dicho.

Nota general: este código probablemente no alcanzará el resultado deseado si el archivo no está bien formateado como ya he mencionado anteriormente.