2017-11-17 2 views
1

은 내가 매개 변수를 사용하여 시작하는 경우 "B" 나에게 (B로 시작하는 행에서) 가장 큰 수있는 행의 색상을 제공하는 스크립트를 작성해야이파일을 bash에서 매트릭스로 읽으려면 어떻게해야합니까?

A;green;3 
B;blue;2 
A;red;4 
C;red;2 
C;blue;3 
B;green;3 

같은 텍스트 파일이 있습니다. 이 경우 마지막 행이되므로 출력은 "green"이됩니다.

";" -s와 개행 문자로 요소를 구분하고 행렬에 저장하면 어떻게됩니까? 저도 그렇게해야합니까, 아니면 더 쉬운 해결책이 있습니까?

미리 감사드립니다.

답변

0

awk + sort 솔루션 :

awk -v param="B" -F';' '$1==param{ print $2; exit }' <(sort -t';' -k1,1 -k3nr file.txt) 

출력 :


또는 @William Pursell의 대답에 추가

green 
은 - 단지 색상을 값을 추출하기 :

awk -F';' '/^B/ && $3>m{ m=$3; c=$2 }END{ print c }' file.txt 
green 

통해 bash는 스크립트

get_max_color.sh 스크립트

#!/bin/bash 

awk -F';' -v p="$1" '$0~"^"p && $3>m{ m=$3; c=$2 }END{ print c }' "$2" 

사용법 :

bash get_max_color.sh B "file.txt" 
green 
+0

감사합니다, 그것은 작동하지만, 나는 그것이 어떤 매개 변수에 대해 작업 할 :

또는, 아마 당신은 연관 배열은 다음과 같이 수행 할 수 있습니다합니다. 예를 들어 "C"로 시작하면 C로 시작하는 행을 검색하고 가장 큰 숫자 값을 가진 행을 선택한 다음이 행의 색을 제공합니다 (이 경우 파란색). – Aaron

+0

@Aaron , 내 첫 번째 접근 방식을 보면,'-v param = "B"''param'은 원하는 값으로 변경할 수있는 변수입니다 – RomanPerekhrest

+0

그래, 내가 바꿀 수 있다는 것도 알지만 다시 바꿀 수있다. 다른 코드는 해당 매개 변수에 대해서만 작동합니다. 나는 그것을 "B"로 시작하면 "녹색"을, "C"로 시작하면 "파란색"을, "A"로 시작하면 "빨간색"을 준다. – Aaron

0

당신은 단지 아프로을 필터링해야 가장 높은 값을 가진 라인을 저장합니다. 확실한 해결책은 다음과 같습니다

awk '/^B/ && $3 > m{s=$0} END { print s}' FS=\; input 

이 매개 변수를 사용하려면 어떻게

awk "/^$1/"' && $3 > m{s=$0} END { print s}' FS=\; input 
+0

답변 해 주셔서 감사합니다. 실제로 "녹색"출력을 제공합니다. 매개 변수 "B",하지만 C 및 A 작동하지 않는 것처럼 보입니다. "C"의 경우 "blue"출력을 기대하지만 대신 "green"을 throw합니다. – Aaron

+0

"blue" : $ foo() {awk "/^$ 1 /"&& $ 3> m {s = $ 0} 끝 {인쇄 s} 'FS = \; 입력; } $ foo C C; 청색; 3' –

0

awk 솔루션, 아마도 덜 우아하고 이미 제안 된 솔루션보다 느린 :

sort -r -t\; -k1,1 -k3 file | uniq -w1 | grep "B" | cut -f2 -d\; 
0

awk 구출하러!

아마

awk -v key="$c" -F\; 'm[$1]<$3{m[$1]=$3; c[$1]=$2} END{print c[key]}' file 

당신이 아마 수있는 키

형편 사용 패턴

$ for c in A B C; 
    do   
    echo $c "->" $(awk -v key="$c" -F\; 'm[$1]<$3 {m[$1]=$3; c[$1]=$2} 
              END  {print c[key]}' file); 
    done; 

A -> red 
B -> green 
C -> blue 

의 파일에서 가장 높은 코딩 색상을 선택합니다 당신이 달성하고자하지만 이해되지 나머지 스크립트를 awk에 구현하고이 프로세스를 한 번 수행하십시오.

$ declare -A colors; 
    while IFS=\; read k c _ ; 
    do 
    colors[$k]=$c; 
    done < <(sort -t\; -k1,1 -k3nr file | uniq -w1) 

$ echo ${colors[A]} 
red 
관련 문제