A.csv
CSVファイル(区切り文字:)があります,
。
sample,run
2071410189,RUN120
2071436273,RUN119
2071507844,RUN120
2071627356,RUN120
2071627370,RUN118
各「サンプル」が所有するファイルをリンクしたいと思います。これを行うには、2つの情報列を使用してパスを設定する必要があります。各行の例A.csv
home/RUN120_*/analyse/2071410189_*_*/*consensus.fasta
home/RUN119_*/analyse/2071436273_*_*/*consensus.fasta
home/RUN120_*/analyse/2071507844_*_*/*consensus.fasta
home/RUN120_*/analyse/2071627356_*_*/*consensus.fasta
home/RUN118_*/analyse/2071627370_*_*/*consensus.fasta
A.csv
複数のファイルでループを実行する方法を知っていますが、同じファイルの各行でループ()を実行する方法がわかりません。何をすべきか知っていますか?
答え1
試してみたいかもしれません
awk -F, '{print "home/" $2 "_*/analyse/" $1 "_*_*/*consensus.fasta"}' file
これはファイルにいくつかの文字列定数を追加するだけです。awk
入力ファイルの各行を繰り返します。
編集する:
@nstatamのコメントで、入力ファイルでファイルパスのセットを設定し、そのファイルをすべて新しいファイルにリンクしようとしていることを読んでいます。これを試して、各パスを引数awk
リストに追加してから、すべてのパスをstdoutに印刷できます(必須ファイルにリダイレクトするか、リダイレクトする必要があります)。
awk -F, '
FNR==NR {ARGV[ARGC++] = "home/" $2 "_*/analyse/" $1 "_*_*/*consensus.fasta"
next}
1
' file
mawk
1.3.4 20200120(Ubuntu)およびバージョン20110810(FreeBSD)でテストされましたawk
。この「パラメータリストに追加」は、すべてのawk
バージョンでは機能しません。
答え2
awkを使用すると、次のことができます。ここでは、$0 フィールドをフィールドごとに再構成し、出力フィールド区切り記号としてスラッシュを使用して出力します。
awk -F "," -v s="_*" '
{
t = "home,"$2 s",analyse,"$1 s s",*consensus.fasta"
split(t,a);$0=""
for (i=1; i in a; i++) $(i) = a[i]
}
1' OFS=/ A.csv
答え3
ファイルの各行を読み取り、その行から2つのフィールドを選択し、表示されたパターンに一致するファイルに対していくつかの操作を実行したい場合は、次のようにします。
#!/bin/sh
tail -n +2 file.csv |
while IFS=, read -r number run
do
printf 'Got number="%s" and run="%s"\n' "$number" "$run"
for name in home/"$run"_*/analyse/"$number"_*_*/*consensus.fasta
do
[ ! -e "$name" ] && continue
# Call program to process FastA file "$name".
printf 'Would process "%s"\n' "$name"
done
done
file.csv
これにより、ヘッダー行をスキップし、各行を2つのカンマ区切りフィールドに解析してシェル変数sumtail
に保存します。number
run
それぞれ$number
と$run
読み取りについて、スクリプトfile.csv
はパターンと一致する名前を繰り返しますhome/"$run"_*/analyse/"$number"_*_*/*consensus.fasta
。パターンが一致すると、一致するたびに単純なメッセージが印刷されます(オプションで他の操作を実行できます)。
読み取った各行に対して、一致するすべてのファイルをいくつかのプログラムの単一の呼び出しで渡すと仮定する別のスクリプトは次のとおりですfile.csv
(パターンがすべての名前と正確に一致する場合)。
#!/bin/sh
tail -n +2 file.csv |
while IFS=, read -r number run
do
printf 'Got number="%s" and run="%s"\n' "$number" "$run"
set -- home/"$run"_*/analyse/"$number"_*_*/*consensus.fasta
[ ! -e "$1" ] && continue
# Call your command with the list of FastA files, "$@".
printf 'Would process "%s"\n' "$@"
# Other example:
# cat "$@" >"$run"-"$number"-consensus.fasta
done
ただ接続したい場合みんなFastAファイルを削除したら、次のことができます。
#!/bin/sh
tail -n +2 file.csv |
while IFS=, read -r number run
do
set -- home/"$run"_*/analyse/"$number"_*_*/*consensus.fasta
[ ! -e "$1" ] && continue
cat "$@"
done >consensus.fasta
または、絶対に確信これらのパターンは常に特定のファイルと一致します(または「該当するファイルまたはディレクトリなし」エラーについてあまり心配しません)。
#!/bin/sh
tail -n +2 file.csv |
while IFS=, read -r number run
do
cat home/"$run"_*/analyse/"$number"_*_*/*consensus.fasta
done >consensus.fasta
答え4
#!/usr/bin/python
k=open('file.txt','r')
k.readline()
for i in k:
var_fin=i.strip().split(',')
var_fj="home/{0}_*/analyse/{1}_*_*/*consensus.fasta".format(var_fin[1],var_fin[0])
print var_fj
出力
home/RUN120_*/analyse/2071410189_*_*/*consensus.fasta
home/RUN119_*/analyse/2071436273_*_*/*consensus.fasta
home/RUN120_*/analyse/2071507844_*_*/*consensus.fasta
home/RUN120_*/analyse/2071627356_*_*/*consensus.fasta
home/RUN118_*/analyse/2071627370_*_*/*consensus.fasta