循环遍历文件夹中每个文件中的行 - 嵌套循环

时间:2016-04-05 13:40:50

标签: shell loops nested

我不知道为什么这不起作用:

for g in *.txt; do for f in $(cat $g); do grep $f annotations.csv; done > ../$f_annot; done

我想循环遍历文件夹中的每个文件,对于我想循环遍历每一行的每个文件并应用grep命令。当我做的时候

for f in $(cat file1.txt); do grep $f annotations.csv; done > ../$f_annot

它有效,它是嵌套循环,不输出任何东西,似乎它正在运行,但它永远持续,什么都不做。

3 个答案:

答案 0 :(得分:1)

当你有一个空的txt文件时,grep $f annotations.csv将被翻译成从stdin读取的grep命令。

您可能想要使用类似

的内容
for g in *.txt; do
   grep -f $g annotations.csv > ../$g_annot
done 

答案 1 :(得分:1)

解决:

for file in *list.txt; do 
   while read -r line; do 
      grep "$line" annotations.csv 
   done < "$file" 
   > ${file}_annot.txt 
done

:)

答案 2 :(得分:0)

我得到了

  

无法写入目录。

     

ksh:../:0403-005无法创建指定的文件。

但这是因为$f_annot评估我们的期望。使用${f}_annot

应该会更好
for g in *.txt; do for f in $(cat $g); do grep $f annotations.csv; done > ../${f}_annot ; done

但是你的脚本中存在一个问题,因为它会删除一些循环的结果:$f总是有循环的最后一个值。也许这更适合您的需求:

for g in *.txt; do for f in $(cat $g); do grep $f annotations.csv; done ; done