2013-09-23 3 views
0

내가 46 열 (4 + 42)와 같은 5200 만 개 행을 가진 파일이 제거하는 방법 : 나는 모든 (42)에 대한 값 누락 한 경우에만 줄을 제거하려는누락 된 값을 포함하는 라인

chr1 rs423246 102 120543 0 2 2 1 1 0 . . . -1 2 2 0 0 . . . . . 2 1 1 -1 -1 
chr1 rs245622 104 134506 2 2 2 1 0 0 0 2 2 2 -1 -1 . . . 2 2 1 1 1 1 1 1 . 2 
chr1 rs267845 105 124564 . . . . . . . . . . . . . . . . . . . . . . . . . . 
chr1 rs234579 106 125642 2 2 2 1 0 0 0 -1 -1 -1 1 0 0 2 1 0 . . . 2 . . 2 1 0 

을 열. 누락 된 값은 "."입니다. (예 : 위의 예에서 행 3이 제거되어야 함) BWK SED 또는 다른 것과 같은 Unix 명령을 사용하여이 행을 어떻게 제거 할 수 있습니까? 도움과 조언을 해주셔서 감사합니다.

답변

2
grep -Ev '\. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \. \.' yourfile 
+0

잠깐만 기다려주세요. 여기에 '.' 일치하는 문자는 없습니까? 42 개의 슬래시를 추가 할 수 있습니다! –

1

가장 읽을 수없는,하지만 헤이! 그 :

perl -ane 'print unless q|.| x 42 eq join q||, @F[4..$#F]' infile 
1

나오지도 '/ {26}/D (.)'파일 이름

편집 :

수정 :

또는 처음 4 후 컬럼의 변수 번호 0 :

sed '/^\([^ ]* \)\{4\}\(\. \)*\./d' filename 
+0

명령이 작동하지만 26을 선택한 이유를 설명해 주시겠습니까? 원본 파일 (38 줄 누락)에서 40 줄을 자르고 명령을 사용하면 출력이 1 줄만 유지되고 나머지는 2 줄에도 불구하고 제거됩니다. 행. 도와주세요! 고마워요 – Maher

+0

@ Maher : 문제가 생겼습니다. 귀하의 예에서는 선이 잘립니다. 라인 3은 26 도트로 끝납니다. 나는 그 설명을 간과했다 ("4 + 42"). 나는 내 대답을 바로 잡을 것이다. – Beta

-1

일부 awk

awk '{a=$0} gsub(/\./,x)!=42 {print a}' file 

적인 버전 42이없는 모든 행을 인쇄합니다. gsub를 사용하여 계산합니다.

awk -F\. NF!=43 file 

사용하는 필드 개수입니다. 분리기로. 이 당신을 위해 작동 할 수

+1

첫 번째 세 열 중 하나에 점이 있고 마지막 열에 점이 하나 더 작은 경우이 두 명령을 모두 사용하면 선이 제거됩니다. – chickegg

+0

데이터가 일치하면 올바르게 작동하지만 올바른 것입니다. – Jotne

1

(GNU를 나오지도) ((43)과하지 (42)가 이유입니다) :

sed -r '/(\.\s*){42}$/d' /file 

또는

sed 's/\./&/42;T;d' file 

N.B. 가장 효율적인 방법은 아마도 첫 번째 해결책 일 것입니다.

관련 문제