두 열에 문자열이 포함된 행 삭제

두 열에 문자열이 포함된 행 삭제

탭으로 구분된 파일이 있습니다.

TRINITY_DN42298_c0_g1_i1.p1 NA  NA
TRINITY_DN12995_c0_g1_i1.p1 PF06799 NA
TRINITY_DN2326_c0_g1_i4.p3  NA  NA
TRINITY_DN6047_c0_g1_i1.p1  PF10585 GO:0008641
TRINITY_DN37780_c0_g1_i3.p2 PF00071 GO:0003924,GO:0005525
TRINITY_DN2787_c0_g1_i2.p1  NA  NA
TRINITY_DN29879_c0_g1_i3.p1 PF01657 NA
TRINITY_DN72702_c0_g1_i1.p1 PF00498 GO:0005515
TRINITY_DN24890_c0_g1_i7.p1 PF00854 GO:0016020,GO:0022857,GO:0055085
TRINITY_DN46477_c0_g1_i1.p1 PF00069 GO:0004672,GO:0005524,GO:0006468

열 2와 열 3 모두에서 NA가 있는 행을 삭제하고 싶습니다.

TRINITY_DN12995_c0_g1_i1.p1 PF06799 NA
TRINITY_DN6047_c0_g1_i1.p1  PF10585 GO:0008641
TRINITY_DN37780_c0_g1_i3.p2 PF00071 GO:0003924,GO:0005525
TRINITY_DN29879_c0_g1_i3.p1 PF01657 NA
TRINITY_DN72702_c0_g1_i1.p1 PF00498 GO:0005515
TRINITY_DN24890_c0_g1_i7.p1 PF00854 GO:0016020,GO:0022857,GO:0055085
TRINITY_DN46477_c0_g1_i1.p1 PF00069 GO:0004672,GO:0005524,GO:0006468

시험을 마친

sed -i '/NA/d' ./file.txt

답변1

당신은 시도 할 수 있습니다 awk:

awk -F'\t' '!($2 == "NA" && $3 == "NA")' file

이 옵션은 두 번째 및 세 번째 매개변수를 취하고 해당 내용이 둘 다 아닌지 확인할 수 있도록 -F필드 구분자를 설정합니다 . 이 경우 라인을 인쇄하십시오.\tNAawk

답변2

스크립트는 하나만 포함하는 줄도 제거하므로 NA구분 기호(공백? 탭? 예를 들어 )로 구분하여 다른 줄을 추가 하고 필드 2와 3이 되도록 [[:space:]]*줄 끝에 수정합니다 .$

sed -i '/NA[[:space:]]*NA$/d' file.txt

답변3

다음과 같이 다양한 방법으로 이 작업을 수행할 수 있습니다.

$ grep -vP '^(?:(?!\t).)+\tNA\tNA(?=\t|$)' inp.tsv

$ sed -Ee 'h;s/\t/\n/;s/$/\t/;/\n(NA\t)\1/d;g' inp.tsv

$ perl -F'\t' -lane 'print if 2 != grep { /^NA$/ } @F[1,2]' inp.tsv

$ perl -MList::MoreUtils=any -F'\t' -lane 'print if any { ! /^NA$/ } @F[1,2]' inp.tsv

   # fs => field separator set to a TAB
   # nT => not TAB
   # F  => consecutive run of non TABs, a field
$ fs="`echo x | tr x '\011'`"; nT="[^${fs}]"; F="$nT$nT*"
$ sed -e "/^$F${fs}NA${fs}NA\$/d" -e "/^$F${fs}NA${fs}NA${fs}/d";exit

결과:

TRINITY_DN12995_c0_g1_i1.p1 PF06799 NA
TRINITY_DN6047_c0_g1_i1.p1  PF10585 GO:0008641
TRINITY_DN37780_c0_g1_i3.p2 PF00071 GO:0003924,GO:0005525
TRINITY_DN29879_c0_g1_i3.p1 PF01657 NA
TRINITY_DN72702_c0_g1_i1.p1 PF00498 GO:0005515
TRINITY_DN24890_c0_g1_i7.p1 PF00854 GO:0016020,GO:0022857,GO:0055085
TRINITY_DN46477_c0_g1_i1.p1 PF00069 GO:0004672,GO:0005524,GO:0006468

가정:

  • 선행 탭 없음
  • 유닉스 스타일 줄 끝 => 개행 =\012
  • LC_ALL=T로 설정된 로케일
  • 입력 파일을 사용자가 읽을 수 있습니다.
  • grep버전 지원 -P옵션
  • sedRHS \t와 같은 비 POSIX 구조를 지원합니다 .\n(...)
  • bash|sh명령줄에서 실행

답변4

아래 명령을 사용해 보았는데 잘 작동했습니다.

주문하다

awk '$2 != "NA" && $3 != "NA" {print $0}'  filename

산출

TRINITY_DN6047_c0_g1_i1.p1  PF10585 GO:0008641
TRINITY_DN37780_c0_g1_i3.p2 PF00071 GO:0003924,GO:0005525
TRINITY_DN72702_c0_g1_i1.p1 PF00498 GO:0005515
TRINITY_DN24890_c0_g1_i7.p1 PF00854 GO:0016020,GO:0022857,GO:0055085
TRINITY_DN46477_c0_g1_i1.p1 PF00069 GO:0004672,GO:0005524,GO:0006468

관련 정보