如何在 awk 过滤中使用一般条件列表?
How to use a general list of conditions in awk filtering?
我使用 awk 过滤 csv 文件 MYFILE 中的 geohash 数据,其中第一列是 geohash。
cat $MYFILE | awk -F ',' '{if( = "^f20" || = "^f28") print [=10=] }' > extractedFile
过滤流畅快速
但现在条件 f20 和 f28 可以是任何内容,作为文本文件中的输入给出。
我写了这个bash循环,但是速度很慢
ZONE=myZones.txt
IFS=$'\n' read -d '' -r -a ZONES < $ZONE
NZONES=${#ZONES[@]}
cat $MYFILE | while read line
do
geohash=`echo $line | cut -d ',' -f 16`
for zonehash in ${ZONES[@]}
do
if [[ $geohash == $zonehash* ]]
then
echo $line >> $MYOUTPUTFILE
else
continue
fi
done
done
我如何调整 awk 命令,以便根据输入的哈希列表构建标有 XXXX 的部分?
cat $MYFILE | awk -F ',' '{if( XXXX ) print [=12=] }' > extractedFile
评论后编辑:
给定以下输入文件
MYFILE.csv
1,一些数据,f244qeb4qhz1
2,一些数据,f2hg1rqq6hh6
3,someData,f244qeb1z2nv
ZONES.txt
f24
awk 'NR==FNR{ZONES[[=34=]]=[=34=]; next} in ZONES {print [=34=]}' ZONES.txt MYFILE.csv
bash
逻辑的简化版本 awk
-
awk 'NR==FNR{ZONES[[=10=]]=[=10=]; next} in ZONES' zones file
zones
是要加载的查找 table。
NR==FNR
检查记录数(总体)是否与 this 文件中的记录数相同 - 换句话说,如果这是第一个文件.
如果是这样,将其加载到查找 table ZONES 中并继续。
如果 NR 与 FNR 不同,则它不再是第一个文件,因此加载查找 table 并且我们正在处理数据。
in ZONES
询问字段 1 是否在查找 table 中,如果是,则执行卷曲中的任何操作。
#编辑
查看您在上面添加的数据,我制作了一个稍大的文件,其中包含与 f20、f24 和 f28 匹配的行。
zones
:
$: cat zones
a
f20
b
f24
c
f28
MYFILE.csv
:
$: cat MYFILE.csv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f194qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f204qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f194qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f244qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f194qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f284qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f194qeb1z2nv
$: awk -F, 'NR==FNR{ZONES[[=12=]]=[=12=]; next} substr(,0,3) in ZONES' zones MYFILE.csv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f204qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f244qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f284qeb1z2nv
希望对您有所帮助。
我使用 awk 过滤 csv 文件 MYFILE 中的 geohash 数据,其中第一列是 geohash。
cat $MYFILE | awk -F ',' '{if( = "^f20" || = "^f28") print [=10=] }' > extractedFile
过滤流畅快速
但现在条件 f20 和 f28 可以是任何内容,作为文本文件中的输入给出。
我写了这个bash循环,但是速度很慢
ZONE=myZones.txt
IFS=$'\n' read -d '' -r -a ZONES < $ZONE
NZONES=${#ZONES[@]}
cat $MYFILE | while read line
do
geohash=`echo $line | cut -d ',' -f 16`
for zonehash in ${ZONES[@]}
do
if [[ $geohash == $zonehash* ]]
then
echo $line >> $MYOUTPUTFILE
else
continue
fi
done
done
我如何调整 awk 命令,以便根据输入的哈希列表构建标有 XXXX 的部分?
cat $MYFILE | awk -F ',' '{if( XXXX ) print [=12=] }' > extractedFile
评论后编辑:
给定以下输入文件
MYFILE.csv 1,一些数据,f244qeb4qhz1 2,一些数据,f2hg1rqq6hh6 3,someData,f244qeb1z2nv
ZONES.txt f24
awk 'NR==FNR{ZONES[[=34=]]=[=34=]; next} in ZONES {print [=34=]}' ZONES.txt MYFILE.csv
bash
逻辑的简化版本 awk
-
awk 'NR==FNR{ZONES[[=10=]]=[=10=]; next} in ZONES' zones file
zones
是要加载的查找 table。
NR==FNR
检查记录数(总体)是否与 this 文件中的记录数相同 - 换句话说,如果这是第一个文件.
如果是这样,将其加载到查找 table ZONES 中并继续。
如果 NR 与 FNR 不同,则它不再是第一个文件,因此加载查找 table 并且我们正在处理数据。
in ZONES
询问字段 1 是否在查找 table 中,如果是,则执行卷曲中的任何操作。
#编辑
查看您在上面添加的数据,我制作了一个稍大的文件,其中包含与 f20、f24 和 f28 匹配的行。
zones
:
$: cat zones
a
f20
b
f24
c
f28
MYFILE.csv
:
$: cat MYFILE.csv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f194qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f204qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f194qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f244qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f194qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f284qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f194qeb1z2nv
$: awk -F, 'NR==FNR{ZONES[[=12=]]=[=12=]; next} substr(,0,3) in ZONES' zones MYFILE.csv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f204qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f244qeb1z2nv
1,someData,f194qeb4qhz1 2,someData,f2hg1rqq6hh6 3,someData,f284qeb1z2nv
希望对您有所帮助。