Linux下多列过滤指定模式但排除第一列的命令实现方案
解决方法:用awk精准指定列范围筛选
直接用awk处理原文件,不需要先执行cut,就能精准检查你指定的列范围(1691-1725),避免误匹配其他列。
场景1:输出原文件的整行
如果要保留原文件的所有列,只筛选1691-1725列中任意一列以140或141开头的行,用这个命令:
awk 'BEGIN { FS = "\t" } { for(i=1691; i<=1725; i++) { if($i ~ /^14[01]/) { print; next } } }' your_file.tsv
场景2:输出指定列(原第2列 + 1691-1725列)
如果要和之前cut的输出格式一致,但只保留符合条件的行,用这个命令:
awk 'BEGIN { FS = OFS = "\t" } { match=0; for(i=1691; i<=1725; i++) { if($i ~ /^14[01]/) { match=1; break } } if(match) { printf "%s", $2; for(i=1691; i<=1725; i++) { printf "%s%s", OFS, $i } print "" } }' your_file.tsv
关键说明
FS = "\t":指定制表符为列分隔符,确保列分割准确/^14[01]/:正则匹配以140或141开头的列值(^表示列内容的起始,避免匹配中间包含140/141的情况)- 循环遍历1691到1725列,只要有一列符合条件就输出,无需检查所有列,效率很高
- 完全不用列出所有10000列,只需要指定要检查的范围即可
内容的提问来源于stack exchange,提问作者Valerie Gaborieau
相关产品推荐
相关产品推荐

