Unix 使用for循环并将变量传递给命令

Unix 使用for循环并将变量传递给命令,unix,grep,Unix,Grep,我有两个文件,table1.txt和table2.txt,第一列中都有字符chr1、chr2和chr3。我想迭代一个命令,以便它从两个表中对只包含chr1、chr2、chr3中的一个的行进行greps,并将该表的子集(比如所有包含chr1的行)传递给另一个命令(比如cat,它将两个表作为输入)。然后将输出保存为文件(对于chr1行的操作,请使用new_chr1.txt) 以下是两个表的虚拟表示: 表1.txt: chr1 5 55 1 chr1 14 62 1 chr1

我有两个文件,table1.txt和table2.txt,第一列中都有字符chr1、chr2和chr3。我想迭代一个命令,以便它从两个表中对只包含chr1、chr2、chr3中的一个的行进行greps,并将该表的子集(比如所有包含chr1的行)传递给另一个命令(比如cat,它将两个表作为输入)。然后将输出保存为文件(对于chr1行的操作,请使用new_chr1.txt)

以下是两个表的虚拟表示:

表1.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
表2.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

A
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
可能还有其他问题,但这就是为什么在意外标记“mkfifo”附近出现“
-bash:syntax error”
”错误(而
done
错误是因为它认为您还没有进入
for
循环)


顺便说一句,在循环中启动最后一个命令之前,您应该使用
wait
,以确保
grep
操作完成。

您可以通过以下操作实现同样的效果:

for i in chr1 chr2 chr3
do
        grep -hw $i table[12].txt > new_$i.txt
done
它使table1.txt和table2.txt都变灰。
-h
停止在每行打印文件名

如果要单独执行这些操作,只需在表2的输出后面附加
>

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

对于使用
cat
的示例,您正确地认为修改后的命令可以正常工作。问题是,真正的命令是更复杂的。是的,使用两个输出的真正命令不是cat。为了简单起见,我使用了cat。嗨,乔纳森,你的意思是在grep命令之后包含wait吗?是的,我的意思是在两个
grep
命令之后和
cat
命令之前。