2013-04-13 129 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