grep을 사용하여 패턴과 일치하는 첫 번째 줄의 모든 줄을 다른 패턴으로 반환

grep을 사용하여 패턴과 일치하는 첫 번째 줄의 모든 줄을 다른 패턴으로 반환

여러 파일을 검색하고 있고 각 줄의 헤더로 표시할 파일 이름이 필요하기 때문에 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 헤더 행과 일치하는 정규식의 일부로 사용됩니다.somethingnameawk

마지막 단락의 출력은 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곳에 사용됩니다 .echobash

./script_name또는 처럼 실행하세요 bash script_name.

관련 정보