2013-04-23 2 views
2

주어진 행에있는 대부분의 값이 동일한 테이블이 있습니다. 내가 뽑아 내고 싶은 것은 적어도 하나의 값이 다른 행입니다. 나는 이런 식으로 그걸하는 법을 알아 냈습니다awk를 사용하여 한 행에서 차이점을 찾을 수

awk -F "\t" '{if (($4!=$5)&&($5!=$6)&&($6!=$7)) print $0;}' 

유일한 문제는 비교할 40 개의 기수 열이 있다는 것입니다. 차이점에 대해 여러 열을 비교하는보다 우아한 방법이 있습니까? BTW - 숫자가 아닌 값이므로 멋진 수학 트릭이 효과가 없습니다.

감사합니다. 나는 뉴비 다. 그래서 나는 모든 명령 등을 이해할 수 없다는 것을 인정해야한다. 그러나 나는 여기서 그것을 볼 수있다. 누구와 함께 할 지 모르겠지만 구체적인 예를 통해 교과서 설명보다 더 많은 것을 배울 수 있으므로 이러한 여러 가지 솔루션을 사용하면 학습 곡선에 큰 도움이됩니다. 이에 따라 조정

awk -F "\t" '{ for(i=4;i<NF;i++) if ($i != $(i+1)) { print; next } }' file 

:

답변

0

당신은 단지 for 루프를 사용할 수 있습니다. HTH.

+0

이것은 n'은 다른 분야의 수는'각 라인'n' ​​번 인쇄됩니다

귀하의 스크립트는이 경우에이 분야에서 변화에만 관심이 제안 $4에서 시작 한 줄에, 당신은 아마 거기에 '다음'을 원할 것입니다. –

+0

예, 맞습니다. 추가됨. – Steve

0

필드가 다른 필드와 다른 경우 필드 1과 다르거 나 필드 1이 다른 필드와 다릅니다 (정의 기준). 다른 모든 필드에 대해 그것을 비교 NF 2 ~ 그러니 그냥 루프 (필드 수) :

awk -F "\t" '{ for (i = 2; i <= NF ;i++) if ($i != $1) { print; next; }}' 

이 선행 필드를 무시하는 조정 (예를 들어, 5에서 시작 $ 4는 비교 대상) 필요에 따라 할 수 있습니다.

6

멋진 수학 트릭이 작동하지 않을 수 있습니다하지만 방법에 대해 :

$ cat file 
one one one one two 
two two two two two 
three four four five 

$ awk '{f=$0;gsub($1,"")}NF{print f}' file 
one one one one two 
three four four five 

먼저 우리는 원래의 상태 f=$0의 라인을 포함하는 모든 분야가 같은 경우 우리가 첫 번째 필드와 일치하는 모든 것에 글로벌 치환을 그러면 아무 것도 남지 않을 것이고 NF은 0이 될 것이고 원래의 줄을 출력하지 않을 것이다.

$ awk '{f=$0;gsub($4,"")}NF>3{print f}' file 
+1

매우, 매우 우아한 +1 – perreal

+1

좋은 Sudo_O – Vijay

+1

멋진, 즉시 +1 –

관련 문제