如果字符串与unix shell脚本中的另一个文件匹配,则打印整个文件行

时间:2017-09-26 05:05:22

标签: shell unix awk

File1 id.txt

101
102
103

File2 \ temp_details.txt

101 john USA
103 Alex USA
104 Nike UK
105 phil UK

如果a.txt的id与emp_details.txt的第一列匹配,则将整行放入match.txt的新文件中。如果不匹配则输出只有id到新文件notmatched.txt < / p>

示例:

matched.txt

101 john USA
103 Alex USA

unmatched.txt(由编辑承担)

102

4 个答案:

答案 0 :(得分:1)

grep -f f1 f2 > matched  
grep -vf <(awk '{print $1}' matched) f1 > not_matched

<强>解释
使用file1作为模式在file2中进行搜索,并将匹配的结果存储在matched文件中 使用matched文件的column1作为模式来搜索file1并将不匹配存储在not_matched文件中 -v表示在grep

中“反转匹配”

输出

$ cat matched
101 john USA
103 Alex USA

$ cat not_matched
102

答案 1 :(得分:0)

通常我们希望您解释一下您尝试过的内容以及您遇到的问题。我们通常不会在此网站上提供完整的答案。由于它只是几行线,我破解了一个效率不高的版本。只需循环遍历id文件并使用egrep查找匹配和不匹配的行。

#!/bin/bash

while read p; do
  egrep "^$p" emp_details.txt >> matched.txt
done <id.txt

while read p; do
  if ! egrep -q "^$p" emp_details.txt; then
    echo $p >> unmatched.txt;
  fi
done <id.txt

答案 2 :(得分:0)

使用awk

<强>一衬垫:

awk 'FNR==NR{ arr[$1]; next }($1 in arr){ print >"matched.txt"; delete arr[$1] }END{for(i in arr)print i >"unmatched.txt"}' file1 file2

更好的可读性:

awk '
        FNR==NR{ 
                 arr[$1]; 
                 next 
        }
        ($1 in arr){ 
               print >"matched.txt"; 
               delete arr[$1]
        }
        END{
               for(i in arr)
                  print i >"unmatched.txt"
        }
    ' file1 file2

测试结果:

$ cat file1
101
102
103

$ cat file2
101 john USA
103 Alex USA
104 Nike UK
105 phil UK

$ awk 'FNR==NR{arr[$1];next }($1 in arr){print >"matched.txt";delete arr[$1]}END{for(i in arr)print i >"unmatched.txt"}' file1 file2

$ cat matched.txt 
101 john USA
103 Alex USA

$ cat unmatched.txt 
102

答案 3 :(得分:0)

与@ Akshay Hegde的回答相比,这是另一个想法。将emp_details.txt中的$1$0地图设置为数组a

awk 'NR==FNR{a[$1]=$0;next} {if($1 in a){print a[$1]>>"matched.txt"}else{print $1 >> "unmatched.txt"}}' emp_details.txt id.txt