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.