2013-04-13 169 views
1

我有兩個文件,table1.txt和table2.txt,第一列的字符爲chr1,chr2,chr3。我想迭代一個命令,使它從兩個表中只查詢包含chr1,chr2,chr3中的一個的行,並將表的子集(稱爲所有行與chr1)傳遞給另一個命令(比如說cat,它接受兩個表格作爲輸入)。輸出然後保存爲一個文件(比如new_chr1.txt用於chr1行上的操作)。使用for循環並將變量傳遞給命令

下面是這兩個表的虛擬表示:

table1.txt:

chr1 5 55 1 
chr1 14 62 1 
chr1 47 97 1 
chr2 4 52 1 
chr2 20 70 1 
chr2 25 75 1 
chr3 3 52 1 
chr3 6 56 1 
chr3 10 60 1 

table2.txt:

chr1 0  199 
chr1 200  399 
chr1 400  599 
chr2 600  799 
chr2 800  999 
chr2 1000 1199 
chr3 1200 1399 
chr3 1400 1599 
chr3 1600 1799 

我嘗試下面的代碼:

for i in chr1 chr2 chr3 
mkfifo table1 
mkfifo table2 
grep -w $i table1.txt > table1 & 
grep -w $i table2.txt > table2 & 
cat table1 table2 > new_$i.txt 
done 

以下是從我的屏幕拷貝,以顯示我在每個階段獲得錯誤:

for i in chr1 chr2 chr3 
mkfifo table1 
-bash: syntax error near unexpected token `mkfifo' 
mkfifo table2 
grep -w $i table1.txt > table1 & 
[5] 1969 
grep -w $i table2.txt > table2 & 
[6] 1970 

cat table1 table2 > new_$i.txt 
[5] Exit 1     grep -w $i table1.txt > table1 
[6] Exit 1     grep -w $i table2.txt > table2 
done 
-bash: syntax error near unexpected token `done' 

我無法找出什麼地方出了錯。如果我只運行上述命令而沒有for循環,並且沒有mkfifo,並且指定了要匹配的模式(比如chr1),它就可以正常工作。任何想法如何使這項工作?

順便說一下,在我的實際代碼中,我必須在兩個grep ed文件上運行另一個命令,而不是cat

回答

2

一個for循環需要一個do啓動循環體:

for i in chr1 chr2 chr3 
do 
    mkfifo table1 
    mkfifo table2 
    grep -w $i table1.txt > table1 & 
    grep -w $i table2.txt > table2 & 
    wait   # Make sure the grep commands are complete before using the results 
    cat table1 table2 > new_$i.txt 
done 

可能有其他的問題,但是這就是爲什麼你得到了「-bash: syntax error near unexpected token `mkfifo'」錯誤(和done錯誤是因爲它沒沒想到你還在for循環中)。

順便說一句,在啓動循環中的最後一個命令之前,應該使用wait,以確保grep操作完成。

+0

喜喬納森,THaks採摘這個錯誤在我的代碼。 – user1938965

+0

嗨喬納森,你的意思是在grep命令之後加入等待嗎? – user1938965

+0

感謝您的幫助。 – user1938965

1

可以實現同樣的事情如下:

for i in chr1 chr2 chr3 
do 
     grep -hw $i table[12].txt > new_$i.txt 
done 

這兩個裏grep和table1.txt table2.txt。 -h停止在每行上打印文件名稱。

如果要單獨做這些,你可以只添加表2的輸出與>>

grep -w $i table1.txt > new_$i.txt 
grep -w $i table2.txt >> new_$i.txt 
+0

對於使用'cat'的例子,你修改後的命令可以正常工作。這個問題確實指出,真正的命令是更復雜的東西。 –

+0

是的,使用這兩個輸出的真正命令不是貓。爲了保持簡單,我使用了貓。 – user1938965