【问题标题】:delete lines not matching pattern删除与模式不匹配的行
【发布时间】:2015-06-06 10:02:53
【问题描述】:

我有两个文件: 文件1:

123,hj,0
345,788,0

文件 2:

nmmnm,m kjlfkj jjljk(gjhgjh;id:123;)
klkl,nkklmk kljlk kjkn(vnbvmn;nbvbn;id:678;jlk;);
hgdsghhj (khj;id:345;)

如果id: and ; 之间的数字与file1 中的column1 不匹配,我想从file2 中删除行。 输出:

nmmnm,m kjlfkj jjljk(gjhgjh;id:123;)
hgdsghhj (khj;id:345;)

【问题讨论】:

  • 顺序很重要,还是您只想跳过第一个文件中没有的 ID 行?
  • 顺序并不重要。如果file2中的行在file1的column1中不包含id,则从file2中删除该行

标签: shell awk


【解决方案1】:

首先生成所有接受的模式,接下来,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 

【讨论】:

    【解决方案2】:

    试试这样的:

    $ 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 中的键。对于第二个文件,matchsubstr 一起使用以提取包含 id1 的行部分。从数组中 id 所在的第二个文件打印行。

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

    【讨论】:

    • id后面的数字不是3位数。它因人而异。分隔符是;
    • 代码中的“3”不是指id的位数,而是指从字符串开头的偏移量。分隔符并不重要。我已经在您的问题中显示了示例的输出。你自己试过吗?
    最近更新 更多