Unix下数据子集提取:按单列多数值条件筛选行
Unix环境下TSV文件指定列多值匹配过滤方案
以下方案均默认你需要筛选的目标列为第N列,可根据实际需求替换示例中的列号(列号从1开始计数)。
方法1:awk直接匹配(最适合20-30个固定值的场景)
直接把允许的取值存在awk的关联数组中判断,效率高且不容易出现误匹配:
# 示例为筛选第2列值为30700、10600等指定值的行,默认保留表头 awk 'BEGIN{FS=OFS="\t"; allow["30700"]=1; allow["10600"]=1; allow["其余目标值按格式新增即可"]=1} NR==1 || allow[$2]' 原始文件.tsv > 筛选结果.tsv
参数说明:
FS=OFS="\t":明确指定输入、输出的字段分隔符为制表符,避免列内容包含空格时出现列拆分错误allow["xxx"]=1:将所有需要匹配的目标值存入关联数组,20-30个值按该格式依次添加到BEGIN块中即可NR==1:保留TSV的表头行,如果你的文件没有表头可以直接删除该判断条件$2:代指要匹配的第二列,可替换为实际需要筛选的列编号
方法2:取值存单独列表文件(适合取值经常变更的场景)
如果目标取值经常调整,不想每次修改命令,可以把所有允许的取值单独存为一个文本文件allow_list.txt,每行写一个目标值:
30700
10600
其他目标值...
再运行以下命令过滤即可:
awk 'BEGIN{FS=OFS="\t"} NR==FNR{allow[$1]=1; next} NR==1 || allow[$2]' allow_list.txt 原始文件.tsv > 筛选结果.tsv
方法3:grep正则匹配(仅作为备选)
该方法容易因为正则写得不准确出现误匹配,非必要不推荐:
# 示例为匹配第2列的指定值,且保留表头 grep -E $'(^表头内容\t|^[^\t]*\t(30700|10600|其余目标值用|分隔)\t)' 原始文件.tsv > 筛选结果.tsv
内容的提问来源于stack exchange,提问作者Nivi
相关产品推荐
相关产品推荐

