建立许多符号链接

建立许多符号链接

samples_long.20Bids.txt我有一个包含如下内容的文件:

P2_305_USD16089489L_HJJNWDSXX_L4
P2_307_USD16089490L_HJNMNDSXX_L3
P2_42_USD16089409L_HJM27DSXX_L1
P2_43_USD16089410L_HJM27DSXX_L1
P2_44_USD16089411L_HJM27DSXX_L1
P2_49_USD16089412L_HJM27DSXX_L1
P2_52_USD16089413L_HJM27DSXX_L1
P2_54_USD16089414L_HJM27DSXX_L1
P2_55_USD16089415L_HJM27DSXX_L1
P2_57_USD16089416L_HJM27DSXX_L1
P2_65_USD16089419L_HJM27DSXX_L1
P2_67_USD16089421L_HJM27DSXX_L2
P2_69_USD16089422L_HJM27DSXX_L2
P2_76_USD16089424L_HJM27DSXX_L2
P2_81_USD16089426L_HJM27DSXX_L2
P2_84_USD16089427L_HJM27DSXX_L2
P2_87_USD16089428L_HJM27DSXX_L2
P2_88_USD16089429L_HJM27DSXX_L2
P2_89_USD16089430L_HJM27DSXX_L2
P2_90_USD16089431L_HJM27DSXX_L2

我想做的就是在一个命令中创建许多符号链接。因此,我awk以这种方式使用它:

awk '{sample=$1; gsub(/_USD.*/,"",sample); print "/disk1/results/alignment/"sample"/"$1"_bowtie2_sorted.bam"}' /disk1/data/samples_long.20Bids.txt |
 ln -s `awk '{print $0}'` `awk -F "/" '{print $7}'`

但是我收到这个错误:

ln: target '/disk1/results/alignment/P2_90/P2_90_USD16089431L_HJM27DSXX_L2_bowtie2_sorted.bam' is not a directory

尽管如此,我可以单独创建符号链接,例如:

ln -s /disk1/results/alignment/P2_90/P2_90_USD16089431L_HJM27DSXX_L2_bowtie2_sorted.bam P2_90_USD16089431L_HJM27DSXX_L2_bowtie2_sorted.bam

并且启动时没有错误...

P2_90_USD16089431L_HJM27DSXX_L2_bowtie2_sorted.bam -> /disk1/results/alignment/P2_90/P2_90_USD16089431L_HJM27DSXX_L2_bowtie2_sorted.bam

我究竟做错了什么?或者说正确的做法是什么?

谢谢你!

更新

感谢 @Gilles 的出色回答,我可以做到:

while IFS= read -r line; 
    do sample=$(echo $line | sed 's/_USD.*//g'); 
    ln -s "/disk1/results/alignment/"$sample"/"$line"_bowtie2_sorted.bam" 
    $line"_bowtie2_sorted.bam"; 
done < /disk1/data/samples_long.20Bids.txt

我必须编辑一点答案,因为我的*_bowtie2_sorted.bam文件保存在由文件中每行的子字符串命名的子目录中,samples_long.20Bids.txt例如。P2_90。但是,我不清楚为什么我的第一个代码不起作用awk

答案1

如果我理解正确的话,您有一个包含名称的文件samples_long.20Bids.txt,每行一个名称。您有一个包含文件的目录(或稍后将包含文件)。您想要创建从另一个目录到该目录的符号链接,并且文件的基本名称相同。

使用 shell 循环可以轻松实现这一点。(参见理解“IFS=读取-r行”有关该循环如何工作的详细说明。简单的解释是,循环体针对文件中的每一行执行一次。)

while IFS= read -r line; do
  ln -s "/disk1/results/alignment/P2_90/$line" .
done <samples_long.20Bids.txt

我不会解释你的 awk 代码做错了什么,因为我不知道你想做什么。

相关内容