awk를 사용하여 두 열을 기반으로 모든 열을 얻는 방법은 무엇입니까?

awk를 사용하여 두 열을 기반으로 모든 열을 얻는 방법은 무엇입니까?

다음과 같은 파일이 있습니다.

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

관련 정보