问题描述
我使用 awk 过滤 csv 文件 MYFILE 中的 geohash 数据,其中第一列是 geohash。
cat $MYFILE | awk -F ',' '{if( $1 = "^f20" || $1 = "^f28") print $0 }' > 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 $0 }' > extractedFile
评论后编辑:
给定以下输入文件
我的文件.csv 1,someData,f244qeb4qhz1 2,f2hg1rqq6hh6 3,f244qeb1z2nv
区域.txt f24
awk 'NR==FNR{ZOnes[$0]=$0; next} $1 in ZOnes {print $0}' ZOnes.txt MYFILE.csv
解决方法
bash
中 awk
逻辑的简化版本 -
awk 'NR==FNR{ZONES[$0]=$0; next} $1 in ZONES' zones file
zones
是要加载的查找表。NR==FNR
检查记录编号(总体)是否与这个文件中的记录编号相同 - 换句话说,如果这是第一个文件。
如果是,则将其加载到查找表 ZONES 中并继续。
如果 NR 与 FNR 不同,则它不再是第一个文件,因此查找表已加载,我们正在处理数据。$1 in ZONES
询问字段 1 是否在查找表中,如果是,则执行 curl 中的任何操作。
#edit
查看您上面添加的数据,我制作了一个稍大的文件,其中包含与 f20、f24 和 f28 匹配的行。
zones
:
$: cat zones
a
f20
b
f24
c
f28
MYFILE.csv
:
$: cat MYFILE.csv
1,someData,f194qeb4qhz1 2,f2hg1rqq6hh6 3,f194qeb1z2nv
1,f204qeb1z2nv
1,f244qeb1z2nv
1,f284qeb1z2nv
1,f194qeb1z2nv
$: awk -F,'NR==FNR{ZONES[$0]=$0; next} substr($7,3) in ZONES' zones MYFILE.csv
1,f284qeb1z2nv
希望有所帮助。