我正在寻找一种bash解决方案,以便在for循环或类似的循环中重命名生物信息学管道中的多个fastq文件。该信息包含在两个列表中。
列表A
SRR11111111
SRR11111112
SRR11111113
SRR11111114
SRR11111115
列表B
Sample1
Sample2
Sample3
Sample4
Sample5
我需要将fastq文件的名称从列表A中的名称更改为列表B中的名称。因此,名为SRR11111111
(列表A中位置1)的fastq文件变为sample1
(列表B中的位置1),依此类推。尽管下面的循环是胡说八道,但它使您对我想做的事情有所了解。
for file in listA
do
mv listA[position] listB[position]
done
在其他软件包(例如python)中,我将为此使用字典,键值对或使用配置文件,但不确定在bash中执行此操作的最有效方法。
这个question与我所寻找的相似,但不完全相同。
答案 0 :(得分:3)
您可以在流程替换中使用paste
:
while read -r old new; do
echo mv "$old" "$new"
done < <(paste listA listB)
mv SRR11111111 Sample1
mv SRR11111112 Sample2
mv SRR11111113 Sample3
mv SRR11111114 Sample4
mv SRR11111115 Sample5
如果对输出感到满意,请在echo
之前删除mv
。
答案 1 :(得分:2)
您也可以在此处使用以下awk
。
awk 'FNR==NR{a[FNR]=$0;next} {system("echo mv " a[FNR] OFS $0)}' ListA ListB
对屏幕上显示的命令满意后,请删除以上代码中的echo
。
答案 2 :(得分:2)
while IFS= read -r fileA && IFS= read -ru 3 fileB; do
mv -- "$fileA" "$fileB"
done < listA 3< listB