![awk를 사용하여 두 열을 기반으로 모든 열을 얻는 방법은 무엇입니까?](https://linux55.com/image/110226/awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%91%90%20%EC%97%B4%EC%9D%84%20%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C%20%EB%AA%A8%EB%93%A0%20%EC%97%B4%EC%9D%84%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음과 같은 파일이 있습니다.
sample chr start end ref alt gene effect
AADA-01 chr1 12336579 12336579 C T VPS13D Silent
AADA-02 chr1 20009838 20009838 - CCA TMCO4 Missense
AADA-03 chr1 76397825 76397825 GTCA T ASB17 Missense
AADA-03 chr1 94548954 94548954 C A ABCA4 Missense
AADA-04 chr1 176762782 176762782 TCG C PAPPA2 Missense
AADA-04 chr1 183942764 183942764 - T COLGAL Missense
AADA-05 chr1 186076063 186076063 A TGC HMCN1 Silent
AADA-05 chr1 186076063 186076063 A T HM1 Silent
다섯 번째와 여섯 번째 열에 문자가 하나만 포함된 모든 행이 필요합니다.
결과는 다음과 같아야 합니다.
sample chr start end ref alt gene effect
AADA-01 chr1 12336579 12336579 C T VPS13D Silent
AADA-03 chr1 94548954 94548954 C A ABCA4 Missense
AADA-05 chr1 186076063 186076063 A T HM1 Silent
나는 이것을 사용하려고합니다.
awk -F'\t' '$5' filename | awk -F'\t' '$6' filename | wc -l
나는 이것이 틀렸다는 것을 알고 있지만 누군가 나를 정정할 수 있습니까?
답변1
awk 'NR==1{print; next}
$5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/' input.txt
설명하다
NR==1{print; next}
그러면 무조건 첫 번째 줄(헤더)이 인쇄되고 다음 줄로 이동합니다.
$5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/
이것은 조건식입니다. 5번째와 6번째 인수가 모두 대문자와 일치하면 해당 행을 인쇄합니다(이 경우 인쇄 명령은 암시적이며 모든 조건에 대한 기본 명령입니다).
$5
$6
각 행의 5번째와 6번째 열을 나타냅니다 .
&&
논리 연산자 AND입니다.
~
정규식 일치 연산자입니다. 왼쪽 매개변수가 오른쪽 정규식과 일치하면 true를 반환합니다.
/^[A-Z]$/
정규식(regexp)입니다. 문자 "/"는 정규식의 구분 기호이고, "^"는 줄(또는 문자열)의 시작을 나타내고, "$"는 끝을 나타내고, "[AZ]"는 A부터 Z까지의 모든 대문자를 나타냅니다.
답변2
awk '$5 ~ /^[ACGT]$/ && $6 ~ /^[ACGT]$/ || NR == 1' data.in
주어진 데이터에 대해 다음이 생성됩니다.
sample chr start end ref alt gene effect
AADA-01 chr1 12336579 12336579 C T VPS13D Silent
AADA-03 chr1 94548954 94548954 C A ABCA4 Missense
AADA-05 chr1 186076063 186076063 A T HM1 Silent
스크립트 awk
는 열 5와 6을 테스트하여 단일 문자 A
, C
또는 G
인지 T
또는 현재 줄이 파일의 첫 번째 줄인지 확인합니다. 그렇다면 해당 행을 인쇄합니다.
테스트는 $5 ~ /^[ACGT]$/
"다섯 번째 열이 정규식과 일치하는지 확인 ^[ACGT]$
"을 의미합니다. 정규식은 단일 문자를 포함하는 주어진 집합()의 모든 항목과 일치합니다 [ACGT]
.
^
"앵커" 이므로 $
각각 주어진 데이터의 시작과 끝(다섯 번째 열과 여섯 번째 열)에서만 일치합니다.
&&
||
논리 AND 및 OR 연산자입니다 .
NR
현재 입력 라인의 일련 번호입니다. NR == 1
현재 줄이 파일의 헤더 줄인 경우 . 헤더 행이 출력 기준을 충족하지 않으므로( 단일 문자가 ref
아니므 alt
로 정규식과 일치하지 않음) 출력에 포함되었는지 확인하려면 이 별도의 테스트가 필요합니다.
답변3
perl -lane 'print if $. == 1 or 2 == grep /^[A-Z]$/, @F[4,5]' data.in