2016-04-05 145 views
-1

我不知道爲什麼這不工作:遍歷文件夾中的每個文件行 - 嵌套循環

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 

它的工作原理,它是嵌套循環,不輸出任何東西,好像它正在運行,但它永遠持續和什麼都不做。

+0

好像u得到路徑文件時,在第二步貓$ G,然後用grep在第三步.....對於相同的場景,你嘗試使用exec/xargs和grep查找命令嗎? .....應該工作,找到這些情況。 – nsd

+0

此外,如果你想知道你的腳本實際上是在工作,即讀取指令行並執行它們.....對於每一行,你可以把set -xv;命令在腳本開始處......它開始在終端上執行之前打印所有帶有參數值的命令。 – nsd

+0

它似乎在做這項工作,因爲使用set -xv輸出:for'$(cat $ g)'grep -color = auto comp102671_c2 annotations.csv - 問題可能是輸出如何被保存? – user3691288

回答

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 
1

當你哈瓦一個空的txt文件,grep $f annotations.csv將被翻譯成grep命令從標準輸入讀取。

你可能想使用類似

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

解決:

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

:)