다음과 같이 탭으로 구분된 파일이 있습니다.
gene v1 v2 v3 v4
g1 NA NA NA NA
g2 NA NA 2 3
g3 NA NA NA NA
g4 1 2 3 2
행당 필드 수는 고정되어 동일합니다. 위 파일에서 2열부터 마지막 열까지 각 행의 모든 필드가 NA인 행을 제거하고 싶습니다. 그러면 출력은 다음과 같아야 합니다.
gene v1 v2 v3 v4
g2 NA NA 2 3
g4 1 2 3 2
답변1
그리고 awk
:
awk '{ for (i=2;i<=NF;i++) if ($i!="NA"){ print; break } }' file
두 번째 필드부터 시작하여 필드를 반복하고 NA
포함되지 않은 필드가 발견되면 해당 행을 인쇄합니다. 그런 다음주기를 끊으십시오.
답변2
GNU sed 사용
sed -e '/g[0-9]\+\(\s*NA\s*\)\+$/d' filename
간단한 설명:
g[0-9]\+\(\s*NA\s*\)\+$
정규식 일치 항목은 줄 끝까지 g
적어도 하나의 숫자와 그 사이에 선택적인 공백이 있는 임의의 수의 s가 뒤따르는 정규식 일치입니다 .NA
sed -e '/<regex>/d'
일치하는 모든 줄 삭제<regex>
동일한 의미를 갖는 보다 표준적인 정규식은 다음과 같습니다.
sed -Ee '/g[0-9]+([[:space:]]*NA[[:space:]]*)+$/d' filename
답변3
all
Perl List::Util 모듈 에서 :
$ perl -MList::Util=all -alne 'shift @F; print unless all { $_ eq "NA" } @F' file
gene v1 v2 v3 v4
g2 NA NA 2 3
g4 1 2 3 2
답변4
당신은 시도 할 수 있습니다:
$ grep -P '\t(?!NA(\t|$))' file
$ sed -e 'h;s/\tNA//g;/\t/!d;g' file
$ perl -MList::MoreUtils=any -F'\t' -lane 'print if any { ! /^NA$/ } @F[1..$#F]' file