여러 파일을 검색하고 있고 각 줄의 헤더로 표시할 파일 이름이 필요하기 때문에 grep을 사용해야 한다고 생각합니다. macOS에서 터미널을 사용하고 있습니다.
"dir" 디렉터리에 다음 내용이 포함된 file1 파일이 있다고 가정해 보겠습니다.
>species one; trnF(ggc)
GGCCC
AACGC
>species one; rrnS
TAGCA
GGCAC
"dir" 디렉터리에는 추가 파일 file2도 있으며 그 내용은 다음과 같습니다.
>species two; trnF(gga)
GGACG
CGACG
GCAC
>species two; rrnS
GCATG
GGCAG
다음 출력을 얻고 싶습니다.
dir/file1:>species one; trnF(ggc)
dir/file1-GGCCC
dir/file1-AACGC
--
dir/file2:>species two; trnF(gga)
dir/file2-GGACG
dir/file2-CGACG
dir/file2-GCAC
-A를 사용하여 패턴이 있는 줄 다음에 지정된 특정 수의 줄을 가져올 수 있습니다.
$ grep -A 2 'trnF' dir/file*
그러나 이러한 파일은 grep 명령 이후의 줄 수가 다르기 때문에 다음과 같은 결과를 얻습니다.
dir/file1:>species one; trnF(ggc)
dir/file1-GGCCC
dir/file1-AACGC
--
dir/file2:>species two; trnF(gga)
dir/file2-GGACG
dir/file2-CGACG
다음 ">" 기호까지 모든 것을 어떻게 얻을 수 있습니까?
답변1
발견한 바와 같이 grep -A
정적인 수의 컨텍스트 줄만 지정할 수 있으므로 유연하지 않습니다.
awk
대신 , 선택한 시퀀스가 발생하는 시기를 감지하고 조건과 일치하지 않는 다른 시퀀스 헤더가 발견될 때까지 이를 출력하는 명령은 다음과 같습니다 .
awk -v name='trnF' -v OFS=':\t' '
FNR == 1 && NR > 1 { print "--" }
/^>/ { out=0 }
$0 ~ "^>.*" name { out=1 }
out == 1 { print FILENAME, $0 }' files
이 옵션은 코드 의 변수 에 -v name=something
할당되며 주어진 문자열을 포함하는 fasta 헤더 행과 일치하는 정규식의 일부로 사용됩니다.something
name
awk
마지막 단락의 출력은 awk
다음과 같습니다.
file: >species one; trnF(ggc)
file: GGCCC
file: AACGC
--
file1: >species one; trnF(ggc)
file1: GGCCC
file1: AACGC
--
( :
다음 탭은 파일 이름과 데이터 사이의 구분 기호로 사용되며 OFS
명령줄에서 다른 항목으로 설정하여 변경할 수 있습니다 -v OFS=somethingelse
.)
답변2
#! /bin/bash
for i in dir/file*
do
[ -n "$is_first_file" ] && echo
awk -v filename="$i" 'BEGIN { temp=1 } { if ($1 ~ /^>/ && temp == 0){exit} } {if ( $1 ~ /^>/ && temp == 1 ) {print filename,"\b:","\b"$0,temp=0 } else { print filename,"\b-","\b"$0 }}' "$i"
echo -n '--'
is_first_file=no
done
echo -n -e "\b\b"
이에 대한 경험이 많지는 않지만 awk
이것이 원하는 정확한 결과를 제공할 것이라고 생각합니다.
이것도 제가 자주 저지르는 실수입니다. 이 스크립트를 그런 식으로 실행하지 마십시오 sh script_name
.
필요한 -e
곳에 사용됩니다 .echo
bash
./script_name
또는 처럼 실행하세요 bash script_name
.