【问题标题】:Executing a bash loop script from a file从文件执行 bash 循环脚本
【发布时间】:2017-12-04 21:12:45
【问题描述】:

我正在尝试在 unix 中执行此操作。例如,假设我有五个以日期命名的文件,每个文件中都有数千个数值(六到十位数字)。现在,假设我也有一堆数值,我想知道哪个值属于哪个文件。我正在尝试像下面这样艰难地做到这一点,但是如何将所有值放在一个文件中并执行一个循环从那里开始。

文件:

20170101
20170102
20170103
20170104
20170105

代码:

for i in 5555555 67554363 564324323 23454657 666577878 345576867; do 
    echo $i; grep -l $i 201701*; 
done

【问题讨论】:

    标签: bash unix while-loop grep echo


    【解决方案1】:

    或者,为什么要循环?如果您有一个包含所有数字的文件(比如numbers.txt,您可以通过简单的方式找到每个日期文件包含在哪个日期文件中以及在哪一行

    grep -nH -w -f numbers.txt 201701*
    

    -f 选项只是告诉grep 使用文件numbers.txt 中包含的值在每个匹配201701* 的文件中搜索。 -nH 选项分别列出与每个匹配项关联的行号和文件名。正如 Ed 在下面指出的那样,-w 选项可确保 grep 仅选择包含所搜索的整个单词的行。

    【讨论】:

    • 很高兴有你在这里 Ed。是的,单词匹配会很​​有帮助。会修改的。
    • 这不会按单词对结果进行分组,您需要再次传递结果来组织它们。
    【解决方案2】:

    您也可以使用while 循环并从文件中读取,如果您按照@Barmar 的建议创建它:

    while read -r i; do
        ...
    done < numbers.txt
    

    【讨论】:

      【解决方案3】:

      将值放入文件numbers.txt 并执行:

      for i in $(cat numbers.txt); do
          ...
      done
      

      【讨论】:

      • 感谢@Barman,这非常有效!实际上这很简单,也许如果我按照逻辑我会意识到如何从文件中提取值。但我还有一个问题,我怎样才能打破界限。包含值的文件出现在它找到的值下方,但我希望它在它旁边。我应该做 echo "$line" 还是 printf "%s\n" "$line"?
      • 其实我不知道我是否想要打印,也许我需要将输出结果放在一个我可以使用的新文件中...... do echo $i >> output。文本文件; grep -l $i 201701* >> output.txt;完成.....但我需要换行符位于 output.txt 中,并且仅适用于日期文件中的值。在我的脑海里听起来很复杂。
      • 你可以做echo $i $(grep -l $i 201701*)
      • 谢谢@Barmar,但输出给了我如下重复的结果。我做了什么来改变 bash。
      • for i in $(cat home/example.txt);回声 $i;回声 $i $(grep -l $i 201701*);完成 结果 6456564 6456564 20170125 9383766 9383766 8386353 8386353 20170111
      猜你喜欢
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多