Tengo un archivo CSV (digamos temp.csv) con cadenas y números. Necesito eliminar las líneas que contienen un patrón particular de cadena al comienzo de las líneas del archivo. Por ejemplo, aquí está mi archivo:
req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
Estoy escribiendo un patrón req_file_curr
en un comando.
~ $ req_file_curr=req1
echo "${req_file_curr}"
da salida comoreq1
Sin embargo, cuando se utiliza en unsed
comando, como a continuación:
sed '/\"${req_file_curr}\"/d' temp.csv
da salida como
req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
Estoy esperando el resultado como
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
¿Cómo puedo usar la variable de un shell como patrón para buscar?sed
oawk
?
Respuesta1
Debe encerrar el sed
patrón entre comillas dobles para que el shell pueda expandir la variable antes de pasarla a sed
:
sed "/^${req_file}/d" temp.csv
También debes usar el ^
ancla para indicar sed
que este patrón debe ocurrir al comienzo de la línea.
Respuesta2
No es necesario awk
o sed
aquí:
grep -v "^$req_file_curr," file
Tenga en cuenta que (como for sed
o awk
aunque en menor medida), se supone que $req_file_curr
no contiene operadores de expresiones regulares (como .
, *
...).
Si es así, tendrías que escapar de esos caracteres, o con awk
, podrías usar un enfoque usando su index()
función:
S="$req_file_curr," awk 'index($0, ENVIRON["S"]) != 1' < file
Respuesta3
Lo has configurado req_file_curr
pero lo usas req_file
. Y su sed
comando no funcionará, ya que la variable de shell no se puede expandir en su sed
comando.
Puedes probar esto:
$ sed '/'"${req_file_curr}"'/d' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
o usando sed
con comillas dobles:
sed "/${req_file_curr}/d" file
y usando awk
:
$ awk -v req=$req_file_curr '$0 !~ req' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
Respuesta4
Una solución educativa sería algo así como.
req_file_curr=req1
printf '%s\n' "g/^$req_file_curr/d" w | ed -s temp.csv
Edita el archivo en el lugar, así que pruébelo primero antes de ejecutarlo en sus archivos.