Bash 在一个目录中查找具有特定模式的成对文件

Bash 在一个目录中查找具有特定模式的成对文件,bash,shell,sed,Bash,Shell,Sed,我需要在一个目录中找到具有特定模式的成对文件: 胡伊普号码什么的。砰&胡伊普号码什么的。砰 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')

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

胡伊普号码什么的。砰&胡伊普号码什么的。砰 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

您是否只想将HU与HU和NOC与NOC匹配?如果是:

如果你加一行

pre=$(echo $ip | awk -F "_" '{print $1}')
然后将您的输入更改为

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

下面为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手册页中找到有关它的更多详细信息

请您添加一个实际示例文件名列表,以及您希望从该集合中看到的结果,好吗。。这些对由文件名的第一部分指定,即
HU_this
HU_this
?我们有两种方法可以对这些样本进行配对,通过HU/NOC或IP/inp。需要将HU\U IP与HU\U inp和相同号码配对,并且需要将NOC\U IP与NOC\U inp和相同号码配对。问题是这两个群体的数字是相同的。需要使用前缀和数字并找到对:inp代表IP,使用唯一的数字和相同的前缀。对不起,如果让人困惑的话。非常感谢!这正是丢失的部分谢谢。它看起来很有用,也很有趣。我一定会学的。