多くのシンボリックリンクの生成

多くのシンボリックリンクの生成

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

私が望むのは、1つのコマンドで多くのシンボリックリンクを作成することです。だから私は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.txtP2_90。しかし、最初のコードが機能しない理由はわかりませんawk

ベストアンサー1

samples_long.20Bids.txt私が正しく理解した場合は、1行に1つずつ名前を含むファイルがあります。ファイルを含む(または後でファイルを含める)ディレクトリがあります。同じファイルのデフォルト名を使用して、別のディレクトリからこのディレクトリへのシンボリックリンクを作成しようとしています。

これはシェルループを使用して簡単に実行できます。 (より「IFS=read-r-line」を理解するこのループがどのように機能するかについての詳細な説明です。簡単な説明は、ループ本体がファイルの各行に対して1回実行されることです。 )

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

私はあなたが何をしたいのかわからないので、あなたのawkコードが何を間違っているかを説明しません。

おすすめ記事