我想在 180 个文件中运行此命令:
cat kegg_random.tsv | while read line ; do
echo "$line" | join -1 2 -2 1 -e"NA" -o1.1,0,2.2,2.3,2.4,2.5 -t $'\t' - kegg_sort_2020.out | shuf -n1 >> RM1_randomKO.tsv
done
我该怎么做?我尝试运行bash
,但出现问题:
#!/bin/bash
for f in *.txt; do
cat "$f" | while read line ; do
echo "$line" |
join -1 2 -2 1 -e"NA" -o1.1,0,2.2,2.3,2.4,2.5 -t $'\t' - kegg_sort_2020.out |
shuf -n1 > "${f%.tsv}"
done
line 4: syntax error: unexpected end of file
谢谢
答案1
缺少第二个done
,因此for
循环变得混乱。修复:
for f in *.txt; do
while read line ; do
echo "$line" |
join -1 2 -2 1 -e"NA" -o1.1,0,2.2,2.3,2.4,2.5 -t $'\t' - kegg_sort_2020.out |
shuf -n1 >> "${f%.tsv}"
done < "$f"
done
笔记: cat
不需要. 注意在需要的>
地方使用。>>
上述代码的逻辑似乎有点混乱。join
在一行上使用 只会输出一行。将这一行传输到shuf
是无用的——这就像试图洗牌一副只有一张牌的“牌”。 也不echo
需要 。代码可以简化为:
for f in *.txt; do
while read line ; do
join -1 2 -2 1 -e"NA" -o1.1,0,2.2,2.3,2.4,2.5 -t $'\t' \
- kegg_sort_2020.out <<< "$line"
done < "$f" >> "${f%.tsv}"
done
join
甚至可能不需要依赖于输入文件结构。明智的做法read
可能就足够了,或者单独使用join
就足够了:
for f in *.txt; do
join -1 2 -2 1 -e"NA" -o1.1,0,2.2,2.3,2.4,2.5 -t $'\t' \
"$f" kegg_sort_2020.out
done >> "${f%.tsv}"