【问题标题】:Shell Script to find string of file A in File B and print Yes or No in front of particular string [closed]Shell脚本在文件B中查找文件A的字符串并在特定字符串前面打印是或否[关闭]
【发布时间】:2016-05-07 01:33:16
【问题描述】:

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

提出任何解决方案。

【问题讨论】:

  • 基本上你会读取fileA的内容并在fileb中搜索fileA的每个字符串?如果有任何匹配,脚本将打印类似“YES - string”或“No - string”的内容?

标签: linux bash shell unix scripting


【解决方案1】:

这是一个选项

#!/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

附言 那是输入文件

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                    

【讨论】:

  • grep 的退出代码告诉您是否匹配。 Don't read lines with for. 引用您的变量。即使解决了这些问题,为了自定义输出格式,重新实现grep -f 也是一种非常低效的方法。
【解决方案2】:

类似的东西:

#!/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

【讨论】:

  • 你想要read -r,除非你特别想让shell解析反斜杠并在read中执行其他奇怪的遗留行为;并在done 之后重定向整个循环一次将比重新打开文件以附加每个输入行更有效。此外,您应该注意引用搜索模式,通常是您不明确要求 shell 执行空格标记化和通配符扩展的任何变量。
  • 感谢您的回复。我修复了代码。
  • 我在你的基础上编辑了另一轮。我不确定覆盖fileA 是否是OP 真正想要的——如果是这样,那么我的部分编辑将需要恢复。无论如何,在变量中维护您想要的输出副本有点麻烦。如果这是所需的行为,我会在最后将 output 移回 fileA 之上。
【解决方案3】:

awk

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

以上 awk 将比较整行。

【讨论】:

  • 到目前为止,这里的其他答案比这个更值得反对。赞成补偿。不过,您可能应该解释一下这是如何工作的。
  • @tripleee 我投了反对票,我认为这是有道理的。这个答案不检查字符串是否在一行上。它检查一个文件中的行是否直接与另一个文件中的行匹配。我不知道这是否是 OP 真正想要的,因为这个问题很糟糕,我也对此表示反对。此外,如果您认为其他答案更值得一票否决,请投反对票。
  • @123 嗯,这个问题在这一点上没有明确说明,但我想你可能是对的。尽管如此,这种方法基本上是我会做的。您可以在 FNR==NR 中构建一个大的 honkin 正则表达式,并将其余代码保持原样,以便对两个输入文件进行一次传递。 ...我确实对另外两个投了反对票,与 cmets。
  • @tripleee 是的,你可以,如果答案是这样,那么我可能会投赞成票。关于with comments,我通常不会评论我投反对票的答案,除非被问到,因为人们往往怀恨在心。
猜你喜欢
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2012-08-10
  • 2012-02-19
  • 1970-01-01
相关资源
最近更新 更多