各行に対してcsvファイルの2つの変数を保存して使用する方法

各行に対してcsvファイルの2つの変数を保存して使用する方法

A.csvCSVファイル(区切り文字:)があります,

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

mawk1.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に保存します。numberrun

それぞれ$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

関連情報