Linux环境下如何匹配file1数据到file2第二列并删除对应行
需求与解决方案
现有文件内容
- file1:
1 2 3 4 5 6
- file2:
ab|1|234|ks| fg|6|567|fg| fg|19|576|ik| sd|3|879|jh|
需求说明
删除file2中第二列数值存在于file1里的行,最终仅保留fg|19|576|ik|这一行。
解决方法
方法一:用awk处理(推荐,逻辑清晰)
执行命令:
awk -F'|' 'NR==FNR{a[$1];next}!($2 in a)' file1 file2
逻辑说明:
-F'|'指定竖线|作为列分隔符- 先读取file1,把每行的数值存入数组
a - 读取file2时,判断第二列
$2是否不在数组a中,符合条件的行直接打印
方法二:用grep+sed组合处理
执行命令:
grep -v -F -f <(sed 's/^/|/;s/$/|/' file1) file2
逻辑说明:
sed 's/^/|/;s/$/|/' file1给file1的每个数值前后加上竖线,变成|1|、|2|格式,避免误匹配(比如防止把19里的1当成匹配项)-f <(...)将sed处理后的内容作为grep的匹配规则-v输出不匹配的行,-F按固定字符串匹配(不启用正则)
两种方法执行后都会得到预期输出:
fg|19|576|ik|
内容的提问来源于stack exchange,提问作者Archana Vinod
相关产品推荐
相关产品推荐

