다음과 같은 결과가 포함된 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
예상대로 작동하지 않음:
데이터의 입력 필드 구분 기호는 입니다
|
. 사용 중인 기본 구분 기호는 공백이나 탭 모음입니다. 이는 이것이 각 줄의 첫 번째 문자가$3
됨을 의미합니다.|
NR==1
그럼에도 불구하고 코드 비트로 인해 첫 번째 줄이 인쇄됩니다.사용한 정규 표현식에 표현식 오류가 있습니다. 확장 정규 표현식에서는 특별
(
하므로)
이스케이프해야 합니다. 그러나 "문자 수 제한 없음 "deleterious\(*\)
과도 일치할 수 없습니다 .\(*
(
|
입력 필드 구분 기호 로 올바르게 작동하려면 awk
with 를 사용하세요 -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