繁体   English   中英

嵌套的Shell用于循环和字符串比较

[英]Shell nested for loop and string comparison

我有两个文件file1

104.128.225.208:8000
103.27.24.114:80
104.128.225.208:8000

和文件2

103.27.24.114:99999999
103.27.24.114:88888888888
104.128.225.208:8000
103.27.24.114:80
104.128.225.208:8000

在file2中有两行

103.27.24.114:99999999
103.27.24.114:88888888888

所以我想检查文件中是否有新行

for i in $(cat $2)
    do
        for j in $(cat $1)
        do
            if [ $i = $j ]; then
                echo $i
            fi
        done
    done

/.program file1 file2

但我没有得到预期的输出。 我认为我的if陈述无法正常运作。 我做错了什么?

你的问题可能是,你是循环遍历文件1 每行 file2中的每一行。

comm实用程序comm您的要求,但是它假定两个文件都已排序。

$ sort file1 -o file1
$ sort file2 -o file2
$ comm -13 file1 file2
103.27.24.114:99999999
103.27.24.114:88888888888

这就是diff目的。 例:

$ diff dat/newdat1.txt dat/newdat2.txt
0a1,2
> 103.27.24.114:99999999
> 103.27.24.114:88888888888

其中newdat1.txtnewdat2.txt是:

104.128.225.208:8000
103.27.24.114:80
104.128.225.208:8000

103.27.24.114:99999999
103.27.24.114:88888888888
104.128.225.208:8000
103.27.24.114:80
104.128.225.208:8000

您可以根据选项和需求简单地测试diff的返回(有无输出)。 (例如, if diff -q $file1 $file2 >/dev/null; then echo same; else echo differ; fi

#!/bin/bash
for n in $(diff file1 file2); do 
   if [ -z "$firstLineDiscarded" ]; then
       firstLineDiscarded=TRUE
   elif [ $n != ">" ]; then 
      echo $n
  fi
done

如果您不喜欢该特定方法,那么这似乎可行。

当然,如果输入语法发生变化(包括数据中的空格),它会崩溃,但是对于这种严格的应用……可能就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM