Shell 删除与模式不匹配的行

Shell 删除与模式不匹配的行,shell,awk,Shell,Awk,我有两个文件: 文件1: 文件2: nmmnm,m kjlfkj jjljk(gjhgjh;id:123;) klkl,nkklmk kljlk kjkn(vnbvmn;nbvbn;id:678;jlk;); hgdsghhj (khj;id:345;) 我想删除file2中的行,如果id:和之间的数字;与文件1中的列1不匹配。 输出: 试着这样做: $ awk -F, 'NR==FNR{a[$1];next}match($0,/id:[0-9]+/)&&substr($0,R

我有两个文件: 文件1:

文件2:

nmmnm,m kjlfkj jjljk(gjhgjh;id:123;)
klkl,nkklmk kljlk kjkn(vnbvmn;nbvbn;id:678;jlk;);
hgdsghhj (khj;id:345;)
我想删除file2中的行,如果id:和之间的数字;与文件1中的列1不匹配。 输出:


试着这样做:

$ awk -F, 'NR==FNR{a[$1];next}match($0,/id:[0-9]+/)&&substr($0,RSTART+3,RLENGTH-3) in a' file1 file2
nmmnm,m kjlfkj jjljk(gjhgjh;id:123;)
hgdsghhj (khj;id:345;)
这将使用第一个文件的第一个字段设置数组a中的键。对于第二个文件,match与substr一起用于提取包含id1的行的部分。从第二个文件(id位于数组中)打印行


1如果匹配成功,变量RSTART和RLENGTH将设置为匹配的开始和匹配模式的字符串长度。substr从匹配开始处提取id,即3个字符。

首先生成要接受的所有模式,然后grep第二个文件:

cut -d ',' -f1 file1 | xargs -L1 printf "id:%s;\n"  | fgrep -f - file2
或者,如果您喜欢分为两个活动:

cut -d ',' -f1 file1 | xargs -L1 printf "id:%s;\n" > patterns
fgrep -f patterns file2 

顺序重要吗,还是只想跳过ID在第一个文件中不存在的行?顺序不重要。如果文件2中的行在文件1的第1列中不包含id,请从文件2中删除该行id后面的数字不是3位。情况各不相同。分隔符为;代码中的3不是指id中的位数,而是指从字符串开始的偏移量。分隔符并不重要。我已经在你的问题中展示了样本的输出。你自己试过吗?
cut -d ',' -f1 file1 | xargs -L1 printf "id:%s;\n"  | fgrep -f - file2
cut -d ',' -f1 file1 | xargs -L1 printf "id:%s;\n" > patterns
fgrep -f patterns file2