从文本文件的两个列表中合并bash中的键值对

时间:2018-07-12 08:30:10

标签: bash dictionary key-value

我正在寻找一种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与我所寻找的相似,但不完全相同。

3 个答案:

答案 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