使用特定模式在一个目录中查找文件对

时间:2017-07-07 18:20:09

标签: bash shell sed

我需要在一个目录中找到具有特定模式的文件对:

  

HU_IP_number_something.bam& HU_inp_number_something.bam   NOC_IP_number_something.bam& NOC_inp_number_something.bam

每对数字为1 ... N

我有一个解决方案,但它仅适用于一个目录中的一组文件HU_ *或NOC_ *。 当HU_ *和NOC_ *都在一个目录中时,如何改进它以找到对?

for ip in *IP*.bam
   do
        num=$(echo $ip | sed 's/[^0-9]//g')
        input=$(find -name *_inp_${num}*.bam)
        echo ip sample: $ip
        echo input sample: $input
   done

一个目录中的文件示例:

HU_inp_1-sorted.bam
HU_IP_1-sorted.bam
NOC_inp_1-sorted.bam
NOC_IP_1-sorted.bam

表示1,2,3,...... N

2 个答案:

答案 0 :(得分:1)

以下为for循环的每次迭代构建一个数组$a

$ for f in *IP*.bam; do s=${f#*_}; a=( *${s} ); declare -p a; done
declare -a a=([0]="HU_IP_number_something.bam" [1]="NOC_IP_number_something.bam")
declare -a a=([0]="HU_IP_number_something.bam" [1]="NOC_IP_number_something.bam")

这可以逐步执行您在filespec中指定的所有文件,剥离第一个“字段”(由下划线分隔符表示),并使用globbing收集数组中的相关文件。

您可以测试数组的长度(${#a[@]}),以确保您有两个条目。

如果要按第二个字段而不是第一个字段进行分组,则需要进行更多处理:

$ for f in *IP*.bam; do s1=${f%%_*}; s2=${f#*_}; s2=${s2#*_}; a=( ${s1}*${s2} ); declare -p a; done
declare -a a=([0]="HU_IP_number_something.bam" [1]="HU_inp_number_something.bam")
declare -a a=([0]="NOC_IP_number_something.bam" [1]="NOC_inp_number_something.bam")

此处使用${var#pattern}${var%pattern}的技术称为参数扩展,您可以在bash手册页中找到有关它的更多详细信息。 Here too.

答案 1 :(得分:0)

您是否只想将HU与HU和NOC匹配到NOC?如果是这样的话:

如果添加一行

pre=$(echo $ip | awk -F "_" '{print $1}')

然后将您的输入更改为

input=$(find -name $pre_inp_${num}*.bam)