2017-12-11 18 views
1

다음과 같이 3 개의 열이 포함 된 테이블이 있습니다. 제품 브랜드 및 제품 (1 열 및 2)의 목록은 내가 각 브랜드 (매출에 정렬 내림차순)의 상위 2 판매 제품을 얻을 수 unix 명령을 사용하여 항목열 1의 각 값의 상위 2 개 항목을 정렬하여 정렬합니다.

Product Brand | Product  | Product Revenue 
A    | biscuit  | 20 
B    | bread  | 33 
C    | candy  | 41 
A    | frozen  | 52 
B    | icecream | 89 
B    | veggies  | 65 
C    | juice  | 43 
D    | coffee  | 78 
E    | tea   | 21 
C    | chips  | 44 
A    | chips  | 29 

의 몇 100 단위로 실행?

예상 출력

Product Brand | Product  | Product Revenue 
A    | frozen  | 52 
A    | chips  | 29 
B    | icecream | 89 
B    | veggies  | 65 
C    | chips  | 44 
C    | juice  | 43 
D    | coffee  | 78 
etc 

답변

1
head -n1 test && tail -n+2 test | sort -k1,1 -k3r,3 | awk 'word!=$1{count=1;word=$1} count<=2{print; count++}' 
Product Brand | Product  | Product Revenue 
A    | frozen  | 52 
A    | chips  | 29 
B    | veggies  | 65 
B    | icecream | 89 
C    | juice  | 43 
C    | chips  | 44 
D    | coffee  | 78 
E    | tea   | 21 

설명 :

  • 당신은 파일의 첫 번째 라인 = 헤더를 인쇄합니다 명령 head -n1 yourfile와 헤더를 분리 할 수 ​​있습니다.
  • && 결합 명령
  • tail -n+2 test 모든 행하지만 헤더를 취
  • sort -k1,1 -k3r,3 - 현재 줄의 첫 번째 단어가 마지막 일치하지 않습니다 -
  • awk 'word!=$1{count=1;word=$1} count<=2{print; count++}' 내림차순 첫 번째 필드의 상승 후 3 필드 정렬 본 단어는 우리의 카운트를 재설정하고 새로운 단어를 저장 : word!=$1{count=1;word=$1} 우리의 수는 두 개의 잉크 라인 이하이고 수가 증가하는 경우 : count<=2{print; count++}
을 0
0

당신은 다음과 같은 노력이 당신을 도움이되는지 알려 주시기 바랍니다 수 없습니다.

sort -t"|" -k1.1 -k3.1 Input_file | tac | awk -F' +| +' 'NR>1{if(++a[$1]<3){print | "sort -k1"};next} 1' 

솔루션의 비선형 라이너 양식을 추가해도됩니다.

sort -t"|" -k1.1 -k3.1 Input_file | 
tac | 
awk -F' +| +' ' 
    NR>1{ 
     if(++a[$1]<3){ 
     print | "sort -k1" 
    }; 
next 
} 
1' 
0
sort -k1,1 -k5,5nr file | awk 'a[$1]++<2' 

첫 번째 열과 두 번째로 마지막 열, 숫자 및 내림차순으로 정렬합니다. 그런 다음 awk은 모든 브랜드에 대해 처음으로 두 개만 유지합니다. 이 구문은 각 브랜드를 키로 저장하고 모든 모양에 대한 가치를 높이는 것을 의미합니다. 이 조건은 처음 두 가지 경우에만 해당됩니다. 그리고 그것이 사실 일 때 라인을 인쇄합니다.

참고 : 예를 들어 | 구분 기호를 사용하고 있는지 확실하지는 않습니다. 원하는 열 번호를 바꾸는 것이 아니라면 그 자리에 공백이 있다고 생각했습니다. 이러한 명령에 구분 기호를 설정해야하는 경우 에 -t'|', 에 -F'|'을 입력해야합니다.