Eliminar líneas de un archivo usando awk o sed según la variable del comando anterior

Eliminar líneas de un archivo usando awk o sed según la variable del comando anterior

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_curren un comando. ~ $ req_file_curr=req1

echo "${req_file_curr}"da salida comoreq1

Sin embargo, cuando se utiliza en unsedcomando, 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?sedoawk?

Respuesta1

Debe encerrar el sedpatró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 sedque este patrón debe ocurrir al comienzo de la línea.

Respuesta2

No es necesario awko sedaquí:

grep -v "^$req_file_curr," file

Tenga en cuenta que (como for sedo awkaunque en menor medida), se supone que $req_file_currno 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_currpero lo usas req_file. Y su sedcomando no funcionará, ya que la variable de shell no se puede expandir en su sedcomando.

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 sedcon 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.

información relacionada