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.