如何删除CSV文件中第4列非指定值的行(避免误删)?
如何精准筛选CSV文件中第4列符合特定值的行?
我来帮你解决这个精准筛选的问题——之前的sed命令之所以会误删,是因为它匹配的是整个行里的关键词,而不是只检查第4列。要实现只保留第4列符合特定值的行,用awk是最直接高效的方案,当然也可以改进sed的写法。
最优方案:使用awk精准匹配第4列
awk天生就是用来处理结构化文本(比如按列分隔的CSV/TSV)的工具,能直接定位到第4列进行判断:
awk '$4 ~ /^(exonic|exonic;splicing|splicing)$/' input.csv > output.csv
命令解释:
$4:表示取当前行的第4个字段(awk默认以空白字符作为分隔符,正好适合你示例里的空格分隔格式)~ /正则表达式/:表示判断第4列是否匹配给定的正则^(exonic|exonic;splicing|splicing)$:正则的意思是完全匹配三个值中的一个:^和$确保是整列匹配,不会出现部分匹配的情况(比如不会把exonic_xxx当成符合条件的)|表示逻辑“或”,分隔三个目标值
运行这个命令后,就会只保留第4列是exonic、exonic;splicing或splicing的行,完全不会误删其他列包含关键词的行。
备选方案:改进sed命令实现精准匹配
如果你更习惯用sed,也可以通过正则定位第4列的位置来实现:
sed -n '/^[^ ]\+ [^ ]\+ [^ ]\+ \(exonic\|exonic;splicing\|splicing\)$/p' input.csv > output.csv
命令解释:
-n和/p:配合使用,只输出匹配正则的行^[^ ]\+ [^ ]\+ [^ ]\+:匹配前三个字段(每个字段是不含空格的内容,后跟空格)\(exonic\|exonic;splicing\|splicing\)$:匹配第4列的目标值,$确保到行尾,也就是第4列之后没有其他内容(如果你的行只有4列的话)
不过这个写法比awk繁琐,而且如果字段里有空格(虽然你示例里没有)就会失效,所以更推荐awk方案。
验证示例
用你提供的输入数据测试awk命令,输出结果正好是你想要的目标内容:
chr1 26162313 26162313 exonic
chr1 26349533 26349535 exonic
chr1 26487940 26487940 exonic
chr1 26162353 26162313 splicing
chr1 26349533 26349535 exonic;splicing
chr1 26357656 26357656 exonic
内容的提问来源于stack exchange,提问作者Saruman
相关产品推荐
相关产品推荐

