
Un archivo es modificado por un script utilizando un archivo de entrada.
141,141_1,BAR,HONDA,ps2_0,sin asignar,ps3_0,sin asignar,ps4_0,sin asignar,ps5_0,sin asignar,ps6_0,sin asignar,ps7_3,HASTA VOLUNTAD,.....
Fichero de entrada-
141,ps7,HASTA VOLUNTAD
Ahora necesito buscar si la columna ps7_3 está actualizada con el valor correcto.
Entonces, del archivo de entrada, separé las columnas.
while read -r line;
do
sub1=$(echo $line|cut -f 1 -d ',');
sub2=$(echo $line|cut -f 2 -d ',');
sub3=$(echo $line|cut -f 3 -d ',');
sub4=$(echo $sub2'.*,'$sub3|sed -e "s/\(.*\)\r/'\1'/");
echo $sub1;
echo $sub2;
echo $sub3;
echo $sub4;
grep $sub4 modded_file.csv.dat;
done<input.csv
La salida es-
141
ps7
TILL WILL
'ps7.*,TILL WILL'
grep: WILL': No such file or directory
Pero cuando corro grep 'ps7.*,TILL WILL' modded_file.csv.dat
, funciona. ¿Cómo puedo grep una variable como se muestra arriba, en un archivo?
Respuesta1
Como puede ver en su entrada, tiene un símbolo de espacio en la variable sub4, así que reescriba esta línea:
grep $sub4 modded_file.csv.dat;
ser
grep -- "$sub4" modded_file.csv.dat;
(Adiciones de @philippos)
Y $sub4
no debe contener comillas simples '
, porque se considerarían parte del patrón de búsqueda.
Creo que su idea errónea es el orden de cómo se realizan las comillas y la expansión: cree que primero se expandirán las variables y luego se realizarán las comillas, por lo que después de la expansión, las comillas simples de la variable citarían la cadena. Pero, de hecho, la cotización se realiza antes de la expansión de la variable, por lo que es necesario citar la$sub
Respuesta2
Correr grep
dentro de un bucle es un antipatrón enorme. Pruebe esto en su lugar.
awk -F "," 'NR==FNR { key[$1]=$2; value[$1]=$3; next }
($1 in key) && ($0 !~ "^" $1 ",.*," key[$1] "," value[$1] ",")' input.csv modded_file.csv.dat
No he tratado de entender por qué quieres o esperas que \r
esté ahí de alguna manera, por lo que esto probablemente requiera algunos ajustes.
Un script Awk consta de una secuencia de * pares {
de acción de condición }
, que se aplican uno por uno en cada línea de entrada. Puede utilizar next
para omitir el script restante para esta línea de entrada y pasar a la siguiente entrada, y puede omitir el{
acción}
parte si simplemente desea imprimir la línea de entrada completa. (También puedes omitir elcondición si desea hacer algo incondicionalmente). Cada línea se divide en campos que están disponibles como $1
, $2
etc. dentro del script. -F ","
establece el separador de campo en coma (el valor predeterminado es una secuencia de espacios en blanco).
El NR==FNR
modismo es una forma común de procesar dos archivos de entrada en Awk. El número de línea general NR
será igual al número de línea dentro del archivo FNR
cuando procese el primer archivo de entrada y será falso posteriormente.
Cuando leemos el primer archivo, almacenamos los campos en dos matrices asociativas, ambas codificadas por el primer campo.
Cuando leemos el segundo archivo, imprimimos cada línea de entrada donde se encuentra la clave en la key
matriz, y la línea completa no coincide con la expresión regular esperada (el primer campo es la clave, seguido de cualquier cosa, seguido de una coma, la columna nombre que almacenamos en key[$1]
, otra coma, el valor esperado que almacenamos en value[$1]
y otra coma más).
En otras palabras, esto encuentra las líneas donde no se cumplió la condición esperada. Saca el !
si quieres las cerillas.