2014-10-24 6 views
0

나는이 구조를 가지고 :AWK 그룹이

aaa,up 
bbb,down 
aaa,down 
aaa,down 
aaa,up 
bbb,down 
ccc,down 
ccc,down 
ddd,up 
ddd,down 

을 그리고 난 다음 출력하고 싶은 : 그래서

aaa,up 
bbb,down 
ccc,down 
ddd,up 

를, 전나무 가지에 의해 그룹입니다 . 그런 다음 적어도 한 줄의 인쇄가 끝나면 인쇄가 끝납니다.

awk -F"," '$2=="up"{arr[$1]++}END{for (a in arr) print a,arr[a]}' 

가 그럼 난 "아래로"$ 2 ==을 변경하고 하나에 두 개의 결과를 조인

지금까지 나는이 있습니다. 그러나 이것으로 저는 위아래에 대한 가치가 중복되었습니다.

때때로 대신 기복의 나는 더 많은 변수 0,1,2,3,4 수신 및 업 상태는 사전에 0과 1

감사합니다.

+0

첫 번째 "aaa"행, 첫 번째 "bbb"행만 가져 오는 것이 최종 결과입니까? 그것이 그 모양입니다. 그렇다면 너무 복잡합니다 ... – twalberg

답변

3

표시되는 값을 저장하고 '업'을 기본 설정으로 저장하는 방법은 무엇입니까?

awk -F "," '$2 ~ /0^(0|1)$/ { $2 = "up" } 
    $2 ~ /^[2-9]/ { $2 = "down" } 
    $2 == "up" || !($1 in a) { a[$1]=$2 } 
    END { OFS=FS; for(k in a) print k, a[k] }' file | sort 

즉, 값이 "up"이면 항상 저장합니다. 그렇지 않으면이 키의 값이 아직없는 경우에만 값을 저장합니다.

귀하의 0,1,2,3,4 요구 사항을 잘 모르겠습니다. 첫 번째 라인은 숫자를 "위"또는 "아래"로 변환합니다.

+0

고마워요! 그리고 fot 0,1,2,3,4 내가 의미했던 것은 o이고 1은 "up"을 의미하고 2,3,4는 "down"을 의미합니다. 그러나이 경우 "up"상태와 일치하지 않는 행에 대해 "down"값을 인쇄하지 않습니다. – Damian

+0

알아 내기가 어렵지 않아야합니다. 그러나 업데이트 된 답변. – tripleee

1

이것은 triplee과 비슷합니다. 그러나 imho와는 완전히 다른 대답을 가지고 있습니다. 특히 변수가 이미 "올라 갔을"때 처리를 건너 뛰면 논리 흐름이 더 명확 해집니다. $ 2 가지 가능한 유형을 식별하는 것은 간단한 사용자 함수를 다시 생각

awk -F"," ' 
function up_p(x){ 
    if(x==0||x=="down") return "down"; else return "up" 
    } 
a[$1]=="up" {next} 
      {a[$1]=up_p($2)} 
END   {for(k in a) print k "," a[k]}' file | sort 
aaa,up 
bbb,down 
ccc,down 
ddd,up 

로 처리하고, 사용자는 기능 ... 불필요

awk -F"," ' 
a[$1]=="up" {next} 
      {a[$1]=($2==0||$2=="down")?"down":"up"} 
END   {for(k in a) print k "," a[k]}' file | sort 
aaa,up 
bbb,down 
ccc,down 
ddd,up 
,

하지만 개인적인 취향에 따라 내 대답에 두 버전을 남겨 둡니다.