101
102
103
101 john USA
103 Alex USA
104 Nike UK
105 phil UK
如果a.txt的id与emp_details.txt的第一列匹配,则将整行放入match.txt的新文件中。如果不匹配则输出只有id到新文件notmatched.txt < / p>
示例:
101 john USA
103 Alex USA
102
答案 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