1

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

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

表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),它工作正常。知道如何进行这项工作吗?

顺便说一句,在我的实际代码中,我必须cat在两个greped 文件上运行另一个命令,而不是 。

4

2 回答 2

2

for循环需要 a来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操作完成。

于 2013-04-13T16:50:21.637 回答
1

您可以通过以下方式实现相同的目的:

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

它同时抓取 table1.txt 和 table2.txt。停止在-h每一行上打印文件名。

如果您想单独执行它们,您可以将 table2 的输出附加>>

grep -w $i table1.txt > new_$i.txt
grep -w $i table2.txt >> new_$i.txt
于 2013-04-13T16:56:26.910 回答