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

5번째와 6번째 열에 문자가 하나만 포함된 모든 줄이 필요합니다.

결과는 다음과 같아야 합니다.

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

스크립트 는 열 5와 6을 테스트하여 단일 문자 , , 또는 awk중 하나인지 또는 현재 줄이 파일의 첫 번째 줄인지 확인합니다. 그렇다면 해당 줄을 인쇄합니다.ACGT

테스트는 $5 ~ /^[ACGT]$/"열 5가 정규식과 일치하는지 확인 ^[ACGT]$"을 의미합니다. 정규식은 주어진 집합( [ACGT])에 단일 문자가 포함된 모든 항목과 일치합니다.

^"앵커" 인 경우 $지정된 데이터의 맨 처음과 맨 끝(각각)에서만 일치합니다(5열과 6열).

&&||논리 AND 및 OR 연산자입니다.

NR현재 입력 라인의 순서 번호입니다. 그렇다면 NR == 1현재 줄은 파일의 헤더 줄입니다. 헤더 행이 출력 기준을 충족하지 않고( 단일 문자가 ref아니므 alt로 정규식과 일치하지 않음) 출력에 포함되도록 하려면 이 별도의 테스트를 수행해야 합니다.

답변3

perl -lane 'print if $. == 1 or 2 == grep /^[A-Z]$/, @F[4,5]' data.in

관련 정보