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 代码做错了什么,因为我不知道你想做什么。