如果字符串与unix shell脚本中的另一个文件匹配,则打印文件的整行 File1 id.txt 文件2 emp_details.txt
如果a.txt的id与emp_details.txt的第一列匹配,则以整行输出到新文件matched.txt。如果不匹配,则仅以id输出到新文件notmatched.txt 例如: matched.txt unmatched.txt(由编辑器假定)如果字符串与unix shell脚本中的另一个文件匹配,则打印文件的整行 File1 id.txt 文件2 emp_details.txt,shell,unix,awk,Shell,Unix,Awk,如果a.txt的id与emp_details.txt的第一列匹配,则以整行输出到新文件matched.txt。如果不匹配,则仅以id输出到新文件notmatched.txt 例如: matched.txt unmatched.txt(由编辑器假定) 通常,我们希望你解释你尝试了什么,以及你的困境。我们通常不会在这个网站上提供完整的答案。因为这只是几行,我破解了一个效率不高的版本。只需在id文件上循环并使用egrep查找匹配和不匹配的行 #!/bin/bash while read p; do
通常,我们希望你解释你尝试了什么,以及你的困境。我们通常不会在这个网站上提供完整的答案。因为这只是几行,我破解了一个效率不高的版本。只需在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
#/bin/bash
读p;做
egrep“^$p”emp_details.txt>>matched.txt
done>unmatched.txt;
fi
使用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
可读性更好:
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
测试结果:
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
与@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
到目前为止你试过什么?你被困在哪里?这里的人通常都很有帮助,但我们不会为您编写代码。或者是的,甚至剪切,无论OP喜欢什么。请参阅。根本没有理由写那种代码。