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 코드가 무엇을 잘못하고 있는지 설명하지 않을 것입니다.