Comment pourrais-je lire et utiliser les valeurs du fichier texte (séparées par des virgules ou des lignes séparées) dans une commande awk

J’ai une commande awk pour filtrer les lignes en utilisant la colonne 2.

awk 'BEGIN { FS = ","; OFS = FS;} {if ($2=="ABC" || $2=="DEF" || $2=="PQR" || $2=="XYZ") print}' $1 >> $1tmp 

Puis-je obtenir la logique pour que je puisse lire les valeurs (ABC, DEF, XYZ) en utilisant un fichier texte et le transmettre en awk.

Inputfile.csv

 1,ABC,100 2,XYZ,200 3,MNO,100 4,PQR,100 5,EFG,100 6,QWE,100 7,DEF,200 

La sortie devrait être comme

 1,ABC,100 2,XYZ,200 4,PQR,100 7,DEF,200 

Le fichier value.txt contient

 ABC PQR DEF XYZ 

Il y a de multiples manières pour y parvenir

 filename = value.txt while IFS='' read -r line || [[ -n "$line" ]]; do awk 'BEGIN { FS = ","; OFS = FS;} {if ($2=="$line") print}' Inputfile.csv done < $filename 

mais n’a pas fonctionné, et je pense que si cela fonctionne, il faudra peut-être beaucoup de temps pour traiter des données volumineuses.

Une autre approche

 filename = value.txt ind=0 while read line ; do MYARRAY[$ind]=$line index=$(($ind+1)) done < $filename awk 'BEGIN { FS = ","; OFS = FS;} {if ($2== ${MYARRAY[@]}) 

mais ici, le problème est que MyArray imprime la valeur sous forme de chaîne (ABC PQR XYZ ….) qui ne correspond pas à la condition if dans awk

Si je lis correctement, alors un fichier variables.txt contenant

 ABC DEF PQR XYZ 

Et un fichier d’entrée data.txt contenant

 1|ABC 2|nope 3|asdkl 4|PQR 5|stuff 6|DEF 7|XYZ 

Vous pourriez utiliser

 awk -F '|' 'NR == FNR { vars[$1]; next } $2 in vars' variables.txt data.txt 

obtenir

 1|ABC 4|PQR 6|DEF 7|XYZ 

Cela fonctionne comme suit:

 NR == FNR { # When processing the first file (overall record number equal to # record number within the file) vars[$1] # remember that $1 was seen next # and process the next record } $2 in vars # when processing the second file: filter for lines where # $2 is one of those remembered tokens.