对目录中的文件进行排序,然后对每个文件执行命令

时间:2016-02-29 16:46:10

标签: bash

我有一个包含编号为

的文件的目录
1>chr1:2111-1111_mask.txt
1>chr1:2111-1111_mask2.txt
1>chr1:2111-1111_mask3.txt
2>chr2:345-678_mask.txt
2>chr2:345-678_mask2.txt
2>chr2:345-678_mask3.txt
100>chr19:444-555_mask.txt
100>chr19:444-555_mask2.txt
100>chr19:444-555_mask3.txt

每个文件在第一行包含>chr1:2111-1111之类的名称,在第二行包含一系列字符。 我需要使用>之前的数字作为指南对数据库中的文件进行数字排序,使用_mask3执行每个文件的命令并使用。

我有这段代码

ls ./"$INPUT"_temp/*_mask3.txt | sort -n | for f in ./"$INPUT"_temp/*_mask3.txt
   do
    read FILE
     Do something with each file and list the results in output file including the name of the string
   done

它可以工作,但是当我检查输出文件中的字符串列表时,它们就像这样

>chr19:444-555
>chr1:2111-1111
>chr2:345-678

为什么?

1 个答案:

答案 0 :(得分:0)

所以......我不确定这里的“工作”是什么,就像你提出的问题一样。

好像你有两个问题。

  1. 您的文件未按排序顺序
  2. 文件名已删除前导数字
  3. 解决1,你的命令ls ./"$INPUT"_temp/*_mask3.txt | sort -n | for f in ./"$INPUT"_temp/*_mask3.txt在这里没有多大意义。您将从ls获取文件列表,然后将其传递给sort。这可能会为您提供所需的输出,但随后您将其输出到for,这没有任何意义。

    实际上,您可以将整个脚本重写为

    for f in ./"$INPUT"_temp/*_mask3.txt
       do
        read FILE
         Do something with each file and list the results in output file including the name of the string
       done
    

    你将拥有完全相同的输出。要对此进行排序,您可以执行以下操作:

    for f in `ls ./"$INPUT"_temp/*_mask3.txt | sort -n`
       do
        read FILE
         Do something with each file and list the results in output file including the name of the string
       done
    

    对于意外截断,文件名中的>字符在bash shell中很重要,因为它将前面命令的stdout指向指定的文件。你需要确保当你在循环中使用变量$f时,你会在那个东西周围加上引号,以防止bash误解文件名command > file类型的东西。