如何在 awk 过滤中使用一般条件列表?

问题描述

我使用 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

解决方法

bashawk 逻辑的简化版本 -

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

希望有所帮助。