我有一个 awk 命令来过滤第 2 列的行。
awk 'BEGIN { FS = ","; OFS = FS;} {if ($2=="ABC" || $2=="DEF" || $2=="PQR" || $2=="XYZ") print}' $1 >> $1tmp
我是否可以获取逻辑,以便我可以使用文本文件读取值(ABC,DEF,XYZ(并将其传递到awk中。
输入文件.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
值.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条件不匹配
如果我没看错,那么给定一个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.