Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Shell脚本,用于在文件B中查找文件A的字符串,并在特定字符串前面打印“是”或“否”_Linux_Bash_Shell_Unix_Scripting - Fatal编程技术网

Linux Shell脚本,用于在文件B中查找文件A的字符串,并在特定字符串前面打印“是”或“否”

Linux Shell脚本,用于在文件B中查找文件A的字符串,并在特定字符串前面打印“是”或“否”,linux,bash,shell,unix,scripting,Linux,Bash,Shell,Unix,Scripting,我有两个文件A和B。文件A包含一些字符串。我想在文件B中查找字符串&如果文件B中有字符串,则在文件a中的字符串前面打印Yes,否则打印NO 提出任何解决方案。这是一种选择 #!/bin/ksh fileA=$1 fileB=$2 #add check to verify if both file are really passed by parameter for line in $(cat $fileA) do check=$(grep $line $fileB) if [ -

我有两个文件A和B。文件A包含一些字符串。我想在文件B中查找字符串&如果文件B中有字符串,则在文件a中的字符串前面打印Yes,否则打印NO

提出任何解决方案。

这是一种选择

#!/bin/ksh
fileA=$1
fileB=$2

#add check to verify if both file are really passed by parameter

for line in $(cat $fileA)
do
   check=$(grep $line $fileB)
   if [ -z "${check}" ];then
        echo "NO-$line"

   else
        echo "YES-$line"

   fi
done > fileNew 
这是fileNew的输出

`YES-string1                                                                                                                                                                                               
 YES-string2                                                                                                                                                                                               
 YES-string3                                                                                                                                                                                               
 NO-string4                                                                                                                                                                                                
 YES-string5                                                                                                                                                                                               
 NO-string6                                                                                                                                                                                                
 YES-string7                                                                                                                                                                                               
 NO-string8 `
你可以加上

mv fileNew $fileA
如果需要替换文件A,请在脚本末尾

问候

C

p、 美国。 这些是输入文件

bash-4.3$ cat fileA.txt                                                                                                                                                                                   
string1                                                                                                                                                                                                   
string2                                                                                                                                                                                                   
string3                                                                                                                                                                                                   
string4                                                                                                                                                                                                   
string5                                                                                                                                                                                                   
string6                                                                                                                                                                                                   
string7                                                                                                                                                                                                   
string8                                                                                                                                                                                                   
bash-4.3$ cat fileB.txt                                                                                                                                                                                   
string2                                                                                                                                                                                                   
string2                                                                                                                                                                                                   
string1                                                                                                                                                                                                   
string3                                                                                                                                                                                                   
string5                                                                                                                                                                                                   
string2                                                                                                                                                                                                   
string7                                                                                                                                                                                                   
string9                    
诸如此类:

#!/bin/bash

while read -r searchPattern; do    
    if grep -q "$searchPattern" fileB; then
        flag="YES"
    else
        flag="NO"    
    fi
    printf "%s %s\n" "$flag" "$searchPattern"
done < fileA >output
#/bin/bash
而read-r搜索模式;做
如果grep-q“$searchPattern”文件b;然后
flag=“是”
其他的
flag=“否”
fi
printf“%s%s\n”“$flag”“$searchPattern”
完成输出
awk

awk 'FNR==NR {a[$0]; next} {if($0 in a){print "YES ",$0}else print "NO ",$0}' B.txt A.txt

上面的awk将比较整行。

基本上,您将读取fileA的内容并在fileb中搜索fileA的每个字符串?如果存在任何匹配,脚本将打印类似“YES-string”或“No-string”的内容?您需要
read-r
,除非您特别希望shell解析反斜杠并在
read
中执行其他奇怪的遗留行为;并且在
完成后重新重定向整个循环一次
将比重新打开文件以便为每个输入行追加更有效。此外,您应该注意引用搜索模式,以及通常不需要shell执行空格标记和通配符扩展的任何变量。感谢您的回复。我修正了密码。我在你的上面编辑了另一轮。我不确定重写
fileA
是否是OP真正想要的——如果是这样的话,那么我的部分编辑将需要恢复。无论如何,在变量中维护所需输出的副本有点麻烦;如果这是理想的行为,我只需将
output
移回到
fileA
的顶部。到目前为止,这里的其他答案比这个答案更值得否决。向上投票以补偿。不过,你或许应该解释一下这是怎么回事。@tripleee我投了反对票,我认为这是有道理的。此答案不检查字符串是否在一行上。它检查一个文件中的行是否与另一个文件中的行直接匹配。我不知道这是否是OP真正想要的,因为这个问题很糟糕,我也投了反对票。另外,如果你认为其他答案更值得投反对票,那么就投反对票。@123嗯,这个问题在这一点上没有明确说明,但我想你可能是对的。不过,这种方法基本上就是我要做的。您可以在
FNR==NR
中构建一个大的honkin'正则表达式,并使其余的代码保持原样,以便对两个输入文件进行单次传递。。。我当然对另外两位投了反对票,并发表了评论。@tripleee是的,你可以,如果答案是这样的话,我可能会投赞成票。关于带有评论的
我通常不会对我投反对票的答案发表评论,除非被问到,因为人们往往怀恨在心。grep
的退出代码告诉你是否有匹配项。引用你的变量。即使修复了这些问题,仅为了定制输出格式,重新实现grep-f也是一种效率极低的方法。