각 행에 대해 csv 파일의 두 변수를 저장하고 사용하는 방법

각 행에 대해 csv 파일의 두 변수를 저장하고 사용하는 방법

A.csvCSV 파일 (구분자: ) 이 있습니다 ,.

sample,run
2071410189,RUN120
2071436273,RUN119
2071507844,RUN120
2071627356,RUN120
2071627370,RUN118

각 "샘플"이 소유한 파일을 연결하고 싶습니다. 이를 위해서는 두 개의 정보 열을 사용하여 경로를 구성해야 합니다. 각 라인의 예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

파일의 각 줄을 읽고, 해당 줄에서 두 개의 필드를 선택하고, 표시된 패턴과 일치하는 파일에 대해 일부 작업을 수행하려는 경우 다음을 수행합니다.

#!/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이렇게 하면 헤더 줄을 건너뛰고 각 줄을 쉼표로 구분된 두 개의 필드로 구문 분석하여 쉘 변수 sum tail에 저장됩니다 .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

관련 정보