【问题标题】:Bash script to compare 2 files with different length strings用于比较具有不同长度字符串的 2 个文件的 Bash 脚本
【发布时间】:2015-02-27 01:09:57
【问题描述】:

我有两个文件,我试图逐行比较每行中的字符串。 File1 仅包含 6 个字符的字符串前缀,而 File2 包含 12 个字符的字符串。如何遍历 File2 以查找以 File1 中的 6 个字符开头的字符串并将其输出到文件?

文件1

002379
005964

文件2

002379ED6212
003354EB4591
004679BB2185
005964AB3379
005964DB5496

【问题讨论】:

    标签: string bash for-loop


    【解决方案1】:

    这个 awk 单行代码可以满足您的需求:

    awk 'NR==FNR{a[$0];next}{for(i in a)if(substr($0,1,6)==i)print}' file1 file2
    

    NR==FNR 仅适用于第一个文件。 file1 的每一行都存储为数组a 中的一个键。 next 跳过另一个块。对于第二个文件中的每条记录,循环遍历 a 中的每个键并比较前 6 个字符。如果相同,打印记录。

    输出:

    002379ED6212
    005964AB3379
    005964DB5496
    

    【讨论】:

      【解决方案2】:

      awk 或许可以做到这一点

      awk 'NR == FNR {a[$0]; next};substr($0, 1, 6) in a' File1 File2
      

      【讨论】:

      • } 之后不需要分号,但除此之外,很好。我不知道我为什么要使用循环!
      • @TomFenech,我只是在使用基于“当一条规则中的 awk 语句很短时,您可能希望将多个语句放在一行中时,使用分号来保证安全。这是通过用分号 (';') 分隔语句来完成。这也适用于规则本身。”看过here
      • 我认为这只适用于块内的语句,而不适用于块本身。
      【解决方案3】:
      grep -f <(sed 's/^/^/' file1) file2
      

      最好使用grep -f 来查找file2 中与file1 中的正则表达式匹配的所有行,但您希望将file1 中的正则表达式锚定到行首。所以使用上面的方法通过添加一个锚来预处理字符串。

      【讨论】:

        【解决方案4】:

        对于纯 Bash 解决方案。 . .假设您使用的是 Bash v4.x,您可以首先填充一个 关联数组,其键是 File1 的行:

        declare -A prefixes
        while read prefix ; do
            prefixes[$prefix]=1
        done < File1
        
        # Now ${prefixes[002379]} is 1, and ${prefixes[005964]} is 1, but
        # ${prefixes[anything-else]} is undefined.
        

        然后检查File2每一行的前六个字符,看是否在这个关联数组中:

        while read word do ;
            prefix="${word:0:6}"
            if [[ "${prefixes[$prefix]}" ]] ; then
               echo "$word"
            fi
        done < File2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多