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

时间:2018-03-26 16:40:20

标签: linux bash shell unix scripting

我的目标是阅读revisions.txt中的每个修订版本,并从logs.txt文件中提取该版本号的文本。

例如revisions.txt文件具有以下输入,

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

logs.txt文件具有以下输入,

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

我希望获得revisions.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 个答案:

答案 0 :(得分:0)

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

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)"

问候!

答案 1 :(得分:0)

您可以简单地使用以下脚本: -

#!/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_info变量不为空,则该行将重定向到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}'