
다음과 같은 파일이 있습니다.
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
중 하나인지 또는 현재 줄이 파일의 첫 번째 줄인지 확인합니다. 그렇다면 해당 줄을 인쇄합니다.A
C
G
T
테스트는 $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