打印行如果只包含一个字符串(两个文件)

时间:2014-09-30 18:34:34

标签: bash awk

如果最多包含一个文件2的字符串,我想从文件1中打印一行。

文件1:

key1    value1  value2  value8  value9
key2    value1  value3  value9
key3    value1  value8  value10

文件2:

value1
value2
value3
value4
value5
value6
value7

期望的输出:

key3    value1  value8  value10

谢谢,Bernardo

3 个答案:

答案 0 :(得分:2)

使用awk

$ awk 'NR==FNR{a[$1]++; next}
       {
        c=0;
        for(i=2;i<=NF;i++){
            if($i in a){c++}
        } 

       } 
       c<=1;' file2 file1
key2    value1

解释

  • NR==FNR{a[$1]++; next}:在读取第一个文件时(当文件的行号FNR等于所有输入的行号NR时),保存a数组中的第一个字段。然后,跳到下一行。这将一直运行,直到脚本将继续到其他行时到达第二个文件。
  • c=0;:将计数器重置为0.
  • for(i=2;i<=NF;i++){}:对于从第2行到最后一行的每个字段。
  • if($i in a){c++}:如果当前字段位于c,如果在第一个文件中找到,则将a加1。
  • c<=1:这是awk的简写if(c<=1){print}

答案 1 :(得分:1)

$ grep -v '.*value1.*value2.*' input
key2    value1

假设input文件包含

key1    value1  value2
key2    value1

答案 2 :(得分:0)

这似乎有效

cat file2 | awk '{print "\\b" $1 "\\b"}' | grep -n -o -f - file1 | cut -d: -f1 | uniq -c | awk '$1==1{print $2}' | xargs -r -i -n1 sed -n "{} p" file1