代码之家  ›  专栏  ›  技术社区  ›  JBaba

如何在Unix中读取嵌套循环中的两个文件

  •  1
  • JBaba  · 技术社区  · 7 年前

    我的目标是阅读 revisions.txt 并根据修订号从 logs.txt 文件

    例如 修订。txt文件 文件具有以下输入,

    • APP-1001
    • APP-1002
    • APP-1004

    日志。txt文件 文件具有以下输入,

    • APP-999:XYZ问题的错误修复
    • APP-1001:XYZ问题的错误修复
    • APP-1002:XYZ问题的错误修复
    • APP-1003:XYZ问题的错误修复
    • APP-1004:XYZ问题的错误修复

    我想得到 修订。txt文件 文件我想出了以下代码,

    #!/bin/bash
    echo "Start!"
    input=logs.txt
    revision=revisions.txt
    
    IFS=$'\n' read -d '' -r -a revs < $revision
    
    for rev in "${revs[@]}"
    do
        echo $rev
        while IFS='' read -r line || [[ -n "$line" ]]; do
           regex='^'$rev'(.*)'
           if [[ $line =~ $regex ]];
           then
              echo $line
           fi
        done < "$input"
    done
    

    输出 截至目前, APP-1001 APP-1002 APP-1004 APP-1004:XYZ问题的错误修复

    仅打印最新版本(即APP-1004)的文本。我在网上读到,不可能在嵌套循环中读取两个文件。

    请建议一种不同的方法。

    提前谢谢。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Matias Barrios    7 年前

    可以嵌套循环,因此可以同时从两个文件进行迭代。

    while read revisions_line
    do
        while read logs_line
        do
    
            echo "This line comes from revisions : $revisions_line"
            echo "This line comes from logs : $logs_line"
    
        done << "$(  cat logs.txt)"
    done << "$(  cat revisions.txt)"
    

    当做

        2
  •  0
  •   Abhijit Pritam Dutta    7 年前

    您可以简单地使用以下脚本进行相同的操作:-

    #!/bin/bash
    
    while read line
    do
       #echo "$line logs.txt"
       log_info=$(grep $line logs.txt)
       if [ log_info != "" ]; then
          echo "$log_info" | awk '{$1=$2=""; print $0}' | sed 's/^[ \t]*//'
       fi
    done < revisions.txt
    

    它将如何工作?While循环将从文件中读取每一行 revisions.txt grep 将在中搜索 logs.txt 文件,如果找到,它会将该行存储在变量中 log_info 。现在如果 log\u信息 变量不为空,该行将重定向到 awk 命令和 awk公司 命令将从行中删除column1和column2,并将输出重定向到 sed 命令和最终 sed公司 将从中删除前导空格。最终产量为:-

    Bug Fix for XYZ issues
    Bug Fix for XYZ issues
    Bug Fix for XYZ issues
    

    如果要修改整个字符串,只需如下所示:-

     echo "$log_info"
    

    如果您不担心前导空格,可以继续执行以下操作:-

    echo "$log_info" | awk '{$1=$2=""; print $0}'