awk una variable como expresión regular

awk una variable como expresión regular

La pregunta es realmente simple, he leído todas las preguntas y todavía no puedo responder. Tengo un archivo simple como este

$cat file1.txt
ALA
AJD
KSF

Y quiero que awk use cada uno de los valores como expresión regular para imprimir líneas de otro archivo a otro:

$cat file2.txt
name,st,ed,le
ALA,10,12,12
ALA,2,5,4
ALA,6,5,8
AJD,5,8,7
KSF,5,8,7

Entonces mi guión es

while read p;
awk -F"," 'NR==1{print $0}' file2.txt > $p.csv
awk -F"," '/$p/{print $0}' file2.txt >> $p.csv
done <file1.txt

Y el resultado deseado sería:

$cat ALA.csv
name,st,ed,le
ALA,10,12,12
ALA,2,5,4
ALA,6,5,8
$cat AJD.csv
name,st,ed,le
AJD,5,8,7
$cat KSF.csv
name,st,ed,le
KSF,5,8,7

Desafortunadamente, solo imprimo los encabezados de cada archivo. Puse manualmente cada valor de file1.txt reemplazando $p y funciona perfectamente. Entonces creo que el problema es que la variable $p no ha sido bien interpretada. Lo intenté con comillas, doblemente simple. También probé muchas sugerencias diferentes que encontré, ¡pero nada parece funcionar!

Respuesta1

Si bien podrías hacer:

awk "/$p/" archivo2.txt > "$p.csv"

eso es tener la conchaexpandirel contenido de la $pvariable de shell en el código pasado a awk, eso es una mala práctica y básicamente equivale a una vulnerabilidad de inyección de comando (por ejemplo, para un valor de $plike ^/{system("reboot");/). Lo mejor es pasar la variable de shell tal como está a awk y usar ~el operador de awk para la coincidencia de expresiones regulares. La mejor manera es a través de una variable de entorno y awkuna ENVIRONmatriz especial:

export P
while IFS= read -r P; do
  awk 'NR == 1 || $0 ~ ENVIRON["P"]' < file2.txt > "$P.csv"
done < file1.txt

Pero aquí, puedes evitar el bucle del shell y hacer solo una pasada en los archivos:

awk 'NR == FNR {files[$0]; next}
     FNR == 1 {for (f in files) print > f ".csv"; next}
     {
       for (f in files)
         if ($0 ~ f) print > f ".csv"
     }' file1.txt file2.txt

información relacionada