
아래와 같이 test.fasta, pas.fasta, cel.fasta라는 fasta 파일이 있습니다.
test.fasta
>tile
ATGTC
>259
TGAT
pas.fasta
>ta
ATGCT
cel.fasta
>787
TGTAG
>yog
TGTAT
>In
NNTAG
아래와 같이 파일 이름과 총 fasta 시퀀스 수를 인쇄해야 합니다.
test,2
pas,1
cel,3
다음 명령을 사용했지만 목적을 달성하지 못했습니다.
grep ">" test.fasta | wc -l && ls test.fasta
저도 그렇게 할 수 있도록 도와주세요.
미리 감사드립니다.
답변1
(to ununt) -c
옵션의 용도는 다음과 같습니다.grep
c
$ grep -ce '^>' -- *.fasta
cel.fasta:3
pas.fasta:1
test.fasta:2
일치하는 파일이 하나만 있는 경우 파일 이름은 인쇄되지 않습니다. 일부 grep
구현에서는 -H
파일 이름이 항상 인쇄되도록 선택할 수 있습니다.
$ grep -Hce '^>' -- *.fasta
cel.fasta:3
정확한 예상 출력을 얻으려면 간단히 다음 .fasta:
으로 바꿀 수 있습니다 ,
.
$ grep -Hce '^>' -- *.fasta | sed 's/\.fasta:/,/'
cel,3
pas,1
test,2
(이는 파일 이름에 .fasta:
와 같은 다른 항목이 포함되어 있지 않다고 가정합니다 my.fasta:foo.fasta
. 물론 출력이 CSV 형식인 경우 파일 이름의 줄 바꿈 또는 문자 ,
및 잠재적인 공백 문자도 문제가 될 수 있습니다.)"
답변2
ENDFILE
GNU awk를 사용하여 합계를 나타냅니다 gensub()
.
$ awk '/^>/{c++} ENDFILE{print gensub(/\.[^.]*$/,",",1,FILENAME) c+0; c=0}' *.fasta
cel,3
pas,1
test,2
위의 내용은 1개 이상의 입력 파일이 존재하는지 여부(쉘 인수 제한보다 작은 경우) 및 파일 이름에 어떤 문자가 있는지에 관계없이 작동합니다 =
(awk가 가능한 경우, 경우에 따라) 이를 변수 할당으로 처리합니다. 이런 일이 발생하면 다음을 참조하세요.https://www.gnu.org/software/gawk/manual/gawk.html#Other-Arguments대처 방법을 알아보세요.)
어떤 awk로도 동일한 작업을 수행할 수 있습니다.
$ awk '/^>/{c[FILENAME]++} END{for (i=1; i<ARGC; i++) {f=ARGV[i]; sub(/\.[^.]*$/,",",f); print f c[ARGV[i]]+0} }' *.fasta
cel,3
pas,1
test,2
답변3
Raku(이전 Perl_6) 사용
~$ raku -e 'for dir(test => / \.fasta $/ ) -> $fh { put ($fh, $_.grep(/ ^^ \> /).elems).join(",") given $fh.lines() };' > outfile.txt
#OR
~$ raku -e 'for dir(test => / \.fasta $/ ) -> $fh { put join ",", $fh, $_.grep(/ ^^ \> /).elems given $fh.lines() };' > outfile.txt
입력 예(비밀번호):
~$ ls *.fasta
cel.fasta pas.fasta test.fasta
예제 출력:
cel.fasta,3
pas.fasta,1
test.fasta,2
이 솔루션은 Perl 프로그래밍 언어 제품군에 속하는 Raku를 사용합니다. 위의 코드는 Raku dir()
와 grep()
루틴에 의존하므로 기존 쉘 기반 파일 글로빙이 존재하지 않거나 제한되는 플랫폼에서 유용할 수 있습니다(SO 토론 참조).여기).
간단히 말해서, 옵션 raku
과 함께 호출되면 -e
Raku의 컴파일러(Rakudo)에게 주어진 단일 라이너를 컴파일하고 실행하도록 지시합니다. 이 메소드는 Raku에게 필터에서 얻은 파일 이름 값을 반복하도록 지시하는 dir()
키워드와 함께 호출됩니다 . 이렇게 발견된 파일 이름은 개별적으로 변수 에 로드되어 블록에서 분석됩니다.for
test => / \.fasta $/
$fh
{…}
블록 내부에서는 오른쪽에서 왼쪽으로 읽으며 파일 핸들 변수에서 추출 lines
되며 , 이 변수는 자동으로 토픽 변수에 로드됩니다. 이 행(현재 에 저장됨 ) 은 행 시작이 있는 행을 찾기 위해 -ped되어 새 시퀀스의 시작을 나타냅니다 . 발견된 행의 개수가 계산되고 합계 개수가 쉼표로 구분되어 행별로 반환됩니다 .$fh
$_
$_
grep
^^
>
fasta
elems
$fh
join
,
put
OP는 원래 "파일 이름"이 반환되도록 요청했으므로 기술적으로 위의 코드로 충분합니다. 그러나 객체 $fh
이기 때문에 확장을 제거하는 것은 쉽습니다 . 확장을 인식 하고 이를 아무것도 없는 것으로 바꾸는 루틴을 추가하기만 하면 됩니다( ).IO::Path
.fasta
extension
$fh
.fasta
""
~$ raku -e 'for dir(test => / \.fasta $/ ) -> $fh { put ($fh.extension(""), $_.grep(/ ^^ \> /).elems).join(",") given $fh.lines() };'
cel,3
pas,1
test,2
https://docs.raku.org/routine/dir
https://docs.raku.org/routine/grep
https://docs.raku.org/routine/extension
https://raku.org