.csvファイルに書き込むためのスクリプトを作成する方法

.csvファイルに書き込むためのスクリプトを作成する方法

30個のサンプルを含むデータセットがあります。各サンプルには、次の名前の2つのfastqファイルがあります。

bigSample_1.R1.fq
bigSample_1.R2.fq

ここで、R1とR2は、私のヌクレオチド配列の読み取り方向を識別します(R1 =正方向、R2 =逆方向)。

私はすべてのfastqファイルをマイコンピュータ()の同じディレクトリに保存しますworkDir=/media/sf_16S_analysis/Dermatite_fastq_concat/FastQ/fastq_Joinが、仮想マシンを使用してbashシェルスクリプトを実行します。

manifest-file.csv次の構造で1つを作成する必要があります。

sample-id,absolute-filepath,direction
sample-1,$PWD/some/filepath/sample1_R1.fastq,forward
sample-1,$PWD/some/filepath/sample1_R2.fastq,reverse

さらに詳しく説明すると、マニフェストファイルはコンマ区切りのテキストファイル(.csvなど)でなければなりません。各行の最初のフィールドはサンプル識別子、2番目のフィールドは絶対ファイルパス、3番目のフィールドは読み取り方向です。ファイルの最初の行は空ではなく、ヘッダー行でなければなりません。

sample-id,absolute-filepath,direction.

.fq今私の質問は:workDirのファイルのリストを読み、manifest-file.csvスクリプトを使用してファイルを生成する方法はありますか?

答え1

採用してパート5ハーマンつまり、サンプルIDがファイル名の最初のドットの前の部分であると仮定します。

#!/bin/sh

csv_print_row () {
    # Outputs a CSV-formatted row of an arbitrary number of fields.
    # Will quote fields containing commas. That's all.

    for field do
        case $field in
            *,*) set -- "$@" "\"$field\"" ;;
            *)   set -- "$@" "$field"
        esac
        shift
    done

    # The fields are now (possibly quoted) in the list of positional parameters.
    # Print this list as a comma-delimited string:
    ( IFS=,; printf "%s\n" "$*" )
}

# Output header
csv_print_row "sample_id" "absolute-filepath" "direction"

# Loop over the *.fq files in the current directory
for fastq in *.fq; do
    # The sample ID is the filename up to the first dot.
    sample_id=${fastq%%.*}

    # Figure out the direction of the sample
    case $fastq in
        *.R1.*) dir=forward ;;
        *.R2.*) dir=reverse ;;
        *)      dir=unknown
    esac

    # Output row for this sample
    csv_print_row "$sample_id" "$PWD/$fastq" "$dir"
done

テスト:

$ ls -l
total 4
-rw-r--r--  1 kk  wheel    0 Mar 13 18:01 sample-1.R1.fq
-rw-r--r--  1 kk  wheel    0 Mar 13 18:01 sample-1.R2.fq
-rw-r--r--  1 kk  wheel    0 Mar 13 18:01 sample-2.R1.fq
-rw-r--r--  1 kk  wheel    0 Mar 13 18:01 sample-2.R2.fq
-rw-r--r--  1 kk  wheel    0 Mar 13 18:01 sample-3.R1.fq
-rw-r--r--  1 kk  wheel    0 Mar 13 18:01 sample-3.R2.fq
-rw-r--r--  1 kk  wheel    0 Mar 13 18:01 sample-4.R1.fq
-rw-r--r--  1 kk  wheel    0 Mar 13 18:01 sample-4.R2.fq
-rw-r--r--  1 kk  wheel  629 Mar 13 18:00 script.sh
-rw-r--r--  1 kk  wheel    0 Mar 13 18:02 strange, sample.R1.fq
-rw-r--r--  1 kk  wheel    0 Mar 13 18:02 strange, sample.R2.fq
-rw-r--r--  1 kk  wheel    0 Mar 13 18:02 strange, sample.R3.fq
$ sh script.sh
sample_id,absolute-filepath,direction
sample-1,/tmp/shell-yash.zm5cvzG6/sample-1.R1.fq,forward
sample-1,/tmp/shell-yash.zm5cvzG6/sample-1.R2.fq,reverse
sample-2,/tmp/shell-yash.zm5cvzG6/sample-2.R1.fq,forward
sample-2,/tmp/shell-yash.zm5cvzG6/sample-2.R2.fq,reverse
sample-3,/tmp/shell-yash.zm5cvzG6/sample-3.R1.fq,forward
sample-3,/tmp/shell-yash.zm5cvzG6/sample-3.R2.fq,reverse
sample-4,/tmp/shell-yash.zm5cvzG6/sample-4.R1.fq,forward
sample-4,/tmp/shell-yash.zm5cvzG6/sample-4.R2.fq,reverse
"strange, sample","/tmp/shell-yash.zm5cvzG6/strange, sample.R1.fq",forward
"strange, sample","/tmp/shell-yash.zm5cvzG6/strange, sample.R2.fq",reverse
"strange, sample","/tmp/shell-yash.zm5cvzG6/strange, sample.R3.fq",unknown

リストを生成します。

sh script.sh >manifest-file.csv

ファイル名に二重引用符が含まれていると、無効なCSV出力が生成されます。

到着適切に二重引用符を含む引用符フィールドを処理するには、次のものを使用する必要があります。

csv_print_row () {
    # Outputs a CSV-formatted row of an arbitrary number of fields.

    # Quote fields that needs quoting
    for field do
        case $field in
            *[,\"]*) set -- "$@" "\"$field\"" ;;
            *)       set -- "$@" "$field"
        esac
        shift
    done

    # Double up internal double quotes in fields that have been quoted
    for field do
        case $field in
            '"'*'"'*'"')
                field=$( printf '%s\n' "$field" | sed 's/"/""/g' )
                # Now remove the extra quote at the start and end
                field=${field%\"}
                field=${field#\"}
        esac
        set -- "$@" "$field"
        shift
    done

    ( IFS=,; printf "%s\n" "$*" )
}

これは改行文字を含むフィールドに対して正しい操作を実行しませんが、これを処理するとこの質問の範囲外になります。

また見なさい:

答え2

これがあなたが探しているものに近いですか?

echo "sample-id,absolute-filepath,direction" > manifest
for f in *.fq; do
  dir="forward"
  g=$(echo $f | grep -Po "(?<=\.R)[0-9](?=\.fq)")
  if [ $g -eq 2 ]; then
    dir="reverse"
  fi
  echo ${f%%.*},$PWD/$f,$dir
done >> manifest
cat manifest

R1とR2のみがあり、次を含むディレクトリで実行しているとします。

関連情報