【问题标题】:How to read two files in a nested loop in Unix如何在 Unix 的嵌套循环中读取两个文件
【发布时间】:2018-03-27 02:18:24
【问题描述】:

我的目标是阅读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。我在网上看到无法在嵌套循环中读取两个文件。

请提出一种不同的方法。

提前致谢。

【问题讨论】:

  • 您在寻找grep -f revisions.txt logs.txt吗?
  • @WilliamPursell 这是一个简单的任务。一旦我得到这条线,我就会在第二个文件中做很多事情。

标签: linux bash shell unix scripting


【解决方案1】:

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

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

问候!

【讨论】:

  • 我收到以下错误,./filter2.sh: line 18: warning: here-document at line 15 delimited by end-of-file (wanted '$(cat svn2.txt)') ./filter2.sh: line 19: syntax error: unexpected end of file
  • @JBaba 你能解决你的问题吗?如果不行请贴代码,我看看。
【解决方案2】:

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

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

【讨论】:

  • 你在这里只读了一行。在内部循环中的logs.txt 文件中找到匹配项后,我必须立即读取多行/迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多