如何在awk命令中读取和使用文本文件值(逗号分隔或行分隔)

时间:2018-06-11 07:25:53

标签: bash shell unix awk sh

我有一个使用第2列过滤行的awk命令。

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

我可以获取逻辑,以便我可以使用文本文件读取值(ABC,DEF,XYZ)并将其传递给awk。

Inputfile.csv

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

输出应该像

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

value.txt文件包含

ABC
PQR
DEF
XYZ

我尝试过多种方法来实现这个目标

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

但是没有用,我认为如果它有效,那么处理大数据会花费很多时间。

另一种方法

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[@]})

但问题是MyArray将值打印为字符串(ABC PQR XYZ ....),它与awk中的if条件不匹配

1 个答案:

答案 0 :(得分:1)

如果我读得正确,那么给出一个包含

的文件variables.txt
ABC
DEF
PQR
XYZ

包含

的输入文件data.txt
1|ABC
2|nope
3|asdkl
4|PQR
5|stuff
6|DEF
7|XYZ

您可以使用

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

获取

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

其工作原理如下:

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.