我需要在一个目录中找到具有特定模式的文件对:
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
答案 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)