A.csv
CSV 파일 (구분자: ) 이 있습니다 ,
.
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
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
파일의 각 줄을 읽고, 해당 줄에서 두 개의 필드를 선택하고, 표시된 패턴과 일치하는 파일에 대해 일부 작업을 수행하려는 경우 다음을 수행합니다.
#!/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
에 저장됩니다 .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