为什么我不能通过“while read”循环运行多个文件?

为什么我不能通过“while read”循环运行多个文件?

我想在 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}"

相关内容