Bash 在一个目录中查找具有特定模式的成对文件
我需要在一个目录中找到具有特定模式的成对文件: 胡伊普号码什么的。砰&胡伊普号码什么的。砰 NOC_IP_number_something.bam和NOC_inp_number_something.bam 每对数字为1…N 我有一个解决方案,但它只对一个目录中的一组文件HU_*或NOC_*有效。 当HU_*和NOC_*都在一个目录中时,如何改进查找对的方法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')
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,使用唯一的数字和相同的前缀。对不起,如果让人困惑的话。非常感谢!这正是丢失的部分谢谢。它看起来很有用,也很有趣。我一定会学的。