레코드 열의 특정 문자열로 일치를 제한하는 방법은 무엇입니까?

레코드 열의 특정 문자열로 일치를 제한하는 방법은 무엇입니까?

다음과 같은 결과가 포함된 2000줄 파일이 있습니다.

> HGNC:24239 |  2   | deleterious_low_confidence(0.01) 
> HGNC:6583  |  1   | deleterious(0.04)

나는 그 라인을 얻고 싶다해로운()아니요유해_낮은_신뢰(). 이 명령을 사용했지만 작동하지 않았습니다.

awk 'NR==1; $3 ~ /^deleterious(*)$/' file1.txt > file2.txt

누구든지 내 명령에 어떤 문제가 있는지 말해 줄 수 있나요? 감사해요!

답변1

명령을 내리는 데는 세 가지 정도가 있는데,

awk 'NR==1; $3 ~ /^deleterious(*)$/' file1.txt > file2.txt

예상대로 작동하지 않음:

  1. 데이터의 입력 필드 구분 기호는 입니다 |. 사용 중인 기본 구분 기호는 공백이나 탭 모음입니다. 이는 이것이 각 줄의 첫 번째 문자가 $3됨을 의미합니다.|

  2. NR==1그럼에도 불구하고 코드 비트로 인해 첫 번째 줄이 인쇄됩니다.

  3. 사용한 정규 표현식에 표현식 오류가 있습니다. 확장 정규 표현식에서는 특별 (하므로 )이스케이프해야 합니다. 그러나 "문자 수 제한 없음 " deleterious\(*\)과도 일치할 수 없습니다 .\(*(

|입력 필드 구분 기호 로 올바르게 작동하려면 awkwith 를 사용하세요 -F '|'. 하지만 이 경우에는 [[:blank:]]*\\|[[:blank:]]*파이프 기호(있는 경우) 주위의 측면 공간/탭도 포함하도록 사용할 수 있습니다 . 리터럴 파이프 기호로 만들려면 앞의 백슬래시가 필요합니다 |. 필드 구분 기호가 단일 문자보다 길면 정규식으로 처리되어 |정규식 내에서 대체됩니다. 표현식은 의 텍스트처럼 작동합니다 [[:blank:]]*[|][[:blank:]]*.|[...]

세 번째 필드를 일치시키기 위해 deleterious(<anything>)표현식을 사용할 수 있습니다 ^deleterious\(.*\)$. 괄호는 정규식에서 특별하기 때문에 이스케이프 처리해야 합니다. 또는 ^deleterious[(].*[)]$사용할 수 있습니다.

이것은 당신이 사용할 것을 의미합니다

awk -F '[[:blank:]]*[|][[:blank:]]*' '$3 ~ /^deleterious\(.*\)$/' file1.txt >file2.txt

주어진 데이터를 바탕으로 이렇게 생성됩니다.

> HGNC:6583  |  1   | deleterious(0.04)

존재하다 file2.txt.

하나의 |필드 구분 기호로 사용할 수 있습니다

awk -F '|' '$3 ~ /^[[:blank:]]*deleterious\(.*\)$/' file1.txt >file2.txt

이렇게 하면 세 번째 필드 시작 부분에 공백이나 탭이 허용됩니다.

답변2

나는 추천할 것이다 fgrep:

fgrep 'deleterious(' file1.txt > file2.txt

을 사용하려면 awk적절한 정규식이 필요합니다.

awk -F '|' '$3 ~ /^ deleterious\(.*\)$/' file1.txt > file2.txt

또는

awk -F ' \| ' '$3 ~ /^deleterious\(.*\)$/' file1.txt > file2.txt

또는

awk '$6 ~ /^deleterious\(.*\)$/' file1.txt > file2.txt

관련 정보