.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이제 다음 구조로 하나를 만들어야 합니다 .

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

더 자세히 설명하면 매니페스트 파일은 쉼표로 구분된(예: .csv) 텍스트 파일이어야 합니다. 각 줄의 첫 번째 필드는 샘플 식별자이고, 두 번째 필드는 절대 파일 경로이며, 세 번째 필드는 읽기 방향입니다. 파일의 첫 번째 줄은 비어 있지 않으며 헤더 줄이어야 합니다.

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만 있고 다음이 포함된 디렉터리에서 실행한다고 가정합니다.

관련 정보