많은 심볼릭 링크 생성

많은 심볼릭 링크 생성

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내가 올바르게 이해했다면 한 줄에 하나씩 이름이 포함된 파일이 있습니다 . 파일을 포함하는(또는 나중에 파일을 포함할) 디렉토리가 있습니다. 동일한 파일의 기본 이름을 사용하여 다른 디렉터리에서 이 디렉터리로의 심볼릭 링크를 생성하려고 합니다.

이는 쉘 루프를 사용하여 쉽게 수행할 수 있습니다. (보다"IFS=read-r-line" 이해이 루프가 어떻게 작동하는지에 대한 자세한 설명입니다. 간단한 설명은 루프 본문이 파일의 각 줄에 대해 한 번씩 실행된다는 것입니다. )

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

나는 당신이 무엇을 하고 싶은지 모르기 때문에 당신의 awk 코드가 무엇을 잘못하고 있는지 설명하지 않을 것입니다.

관련 정보