2017-07-07 35 views
1

我需要找到对文件的特定图案在一个目录:查找一个目录中的文件对特定图案

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

数字是1,...,N为每对

我有一个解决方案,但它仅适用于一组文件HU_ *Ø r 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

+0

您能否添加实际样本文件名列表以及您希望从该集合中看到的结果? – ghoti

+0

因此,这些对由文件名的第一部分指定,即“HU_this”和“HU_that”?我们可以通过HU/NOC或IP/inp两种方式配对这些样本。 – ghoti

+0

需要将HU_IP与HU_inp和相同的数字进行配对,并且需要将NOC_IP与NOC_inp和相同的数字进行配对。这两个组的数字相同的问题。需要采取前缀和号码,并找到一对:inp的IP,使用唯一的号码和相同的前缀。 对不起,如果它很混乱。 – Suvar

回答

0

你只想匹配HU胡和NOC对NOC?如果是这样的:

如果添加线

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

则输入更改为

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

非常感谢!这正是缺少的部分 – Suvar

1

下建立用于循环的每一次迭代的阵列,$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") 

这是通过所有你已经在你的文件规范中指定的文件的步骤,剥离的第一个“场”(并标示为下划线分隔),并使用通配符来收集阵列中的相关文件。

您可以测试阵列的长度(${#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.

+0

谢谢。它看起来很有用也很有趣。我一定会学习它。 – Suvar

相关问题