如果字符串与unix shell脚本中的另一个文件匹配,则打印文件的整行 File1 id.txt 文件2 emp_details.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

如果a.txt的id与emp_details.txt的第一列匹配,则以整行输出到新文件matched.txt。如果不匹配,则仅以id输出到新文件notmatched.txt

例如:

matched.txt unmatched.txt(由编辑器假定)
通常,我们希望你解释你尝试了什么,以及你的困境。我们通常不会在这个网站上提供完整的答案。因为这只是几行,我破解了一个效率不高的版本。只需在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喜欢什么。请参阅。根本没有理由写那种代码。