Buscar valores en 2 columnas de CSV

Tengo un file csv con 20 columnas impares.

Necesito get los valores de columna 14 y 15 donde el valor en la columna 14 es decir "VALUE1" y el valor en la columna 15 es "VALUE2" .

Mi condición se satisface solo cuando la 14ª columna tiene VALUE1 y la 15ª columna tiene VALUE2 . Necesito get el conteo agregado.

Creo que wc -l podría darme la list de recuento y cut -d "," -f14,15 me da los valores de columna 14 y 15. ¿Pero cómo comprobar si 14th tiene VALUE1 y 15th tiene VALUE2 ?

Creo que el siguiente funciona

 grep -r "" * | cut -d " " -f14,15 | grep "Value1" | grep "Value2" 

pero aun así, no creo que esta sea la manera perfecta de hacerlo.

Solutions Collecting From Web of "Buscar valores en 2 columnas de CSV"

awk podría ser más útil aquí.

Por ejemplo:

 $> echo "abcde" | awk '$2=="b" && $3=="c" {print}' abcde $> echo "abcde" | awk '$2=="a" && $3=="c" {print}' $> echo "abcde" | awk '$2=="b" && $3=="d" {print}' 

Así que la respuesta a su pregunta podría ser:

awk '$14=="VALUE1" && $15=="VALUE2" {print}'

Si awk no está disponible, puedes hacerlo con cut , grep y wc :

 $ echo -e 'a,b, c,d\na,val1 ,val2,c' \ | cut -d ',' -f2,3 | grep '^ *val1 *, *val2 *$' | wc -l 

Asumiendo , como delimitador (y no de alguna manera escapado , está incluido) en la input. Para fines de testing, se utilizan las columnas 2 y 3 en lugar de 14 y 15.

Tenga en count que el patrón grep permite espacios en blanco al final después / antes de los valores (puede eliminar los * subparameters si no lo desea). Los metacaracteres ^ y $ coinciden con el comienzo y el final de una línea.

El pipe grep "Value1" | grep "Value2" grep "Value1" | grep "Value2" de su pregunta no hace lo que usted especifica, podría coincidir demasiado, por ejemplo:

     ..., Value1Value2, ...
     ..., Value1, Value2, ...
     ..., OtherValue1, Value2, ...
     ...

Si awk está disponible (es bastante estándar) puedes hacerlo así:

 $ echo -e 'a,b, c,d\na,val1,val2,c' \ | awk -F, '$2 == "val1" && $3 == "val2" {++sum} END {print sum}' 

awk recorta automáticamente el espacio en blanco de los valores. END es un patrón especial que coincide una vez procesadas todas las líneas.

La siguiente function usará solo Bash para hacer lo que desee:

 foo () { local filename="$1"; while IFS=, read -ra arr; do if [[ "${arr[13]}" = "VALUE1" && "${arr[14]}" = "VALUE2" ]]; then printf '%s\n' "${arr[13]}" "${arr[14]}"; fi; done < "$filename" } 

Uso: foo [/path/to/file.txt]

Muestra de salida:

 rany$ cat > source.txt a,a,a,a,a,a,a,a,a,a,a,a,a,VALUE1,VALUE2 a,a,a,a,a,a,a,a,a,a,a,a,a,NOMATCH1,NOMATCH2 a,a,a,a,a,a,a,a,a,a,a,a,a,VALUE1,VALUE2 rany$ foo source.txt VALUE1 VALUE2 VALUE1 VALUE2