bash/shell 명령을 사용하여 다른 열의 일치하는 값을 기반으로 csv 파일의 열에서 값을 반환하는 방법

bash/shell 명령을 사용하여 다른 열의 일치하는 값을 기반으로 csv 파일의 열에서 값을 반환하는 방법

다음을 수행하는 bash 스크립트에 대한 도움이 필요합니다.

| section | category | description | date      | metric | value    |
| --------| ---------|-------------|-----------|--------|----------|
| y       | testing  |    abc      |03/02/2022 |        |  14845.0 |
| x       | row      |    pqy      | 01/16/2022|        | 12565.0  |
| x       | row      |    xyz      | 02/21/2021|        | 13888.0  |
| x       | row      |    xyz      | 10/04/2020|        | 18160.0  |

설명을 검색할 때 날짜와 함께 값 열을 내림차순으로 반환하고 싶은데 xyz해당 값에 해당하는 값만 반환하고 날짜와 관련된 가장 높은 값만 반환해야 합니다. 중복된 날짜도 있을 수 있습니다. 예를 들어:

10/04/2020 18160
02/21/2021 13888 

위의 예에는 설명이 있으며 xyz날짜와 함께 내림차순으로 값을 반환합니다.

내가 시도한 것: 나는 이것에 갇혔습니다.

awk '$2 ~ /xyz/ {print $3}' covid19_cases_demographics_tests_2022-03-21.csv(this is my csv file)

제가 쉘 스크립팅과 유닉스 관련 작업을 처음 접하므로 몇 가지 예를 통해 올바른 방향으로 안내해 주십시오. 감사해요

답변1

표시되는 열에 따르면 잘못된 색인을 사용하고 있습니다.awk

$0첫 번째 열(섹션)은 , 두 번째 열(카테고리)은 $1, 세 번째 열(설명)은 이라고 가정하고 있는 것 같습니다 $2. 그러나 실제로는 전체 라인을 나타내는 awk데 사용됩니다 . $0따라서 설명 열을 검색하려면 $3일치 논리를 사용하고 $6값 열에서 인쇄해야 합니다. 다른 형식이 아닌 올바른 csv 파일이 있다고 가정하면 -F 옵션을 설정하여 쉼표와 같은 사용자 정의 필드 구분 기호를 지정해야 할 수도 있습니다. 그러나 여기에는 문제가 있습니다. 인용된 문자열을 포함하는 더 복잡한 csv 파일은 여전히 ​​이 문제를 해결할 수 있습니다.

awk -F, '$3 ~ /xyz/ {print $6}' file.csv

인용된 문자열에 공백이나 구분 기호로 사용되지 않는 쉼표와 같은 문자열이 포함될 수 있는 더 복잡한 csv 파일이 있는 경우 awk(and grepsed)가 작업에 가장 적합한 도구가 아닐 수 있습니다. 이 경우 csvtool유틸리티는 상황을 인식하므로 더 잘 작동합니다. Fedora에서 이 유틸리티는 패키지의 일부이지만 ocaml-csv다른 배포판에서는 패키지 이름이 다를 수 있습니다.

이 경우 필요한 열을 인쇄하고, 함수를 내보내고, csvtool열을 전달하는 함수를 작성할 수 있습니다. 더 복잡한 필드가 있는 경우 더 많은 작업이 필요하지만 더 안전합니다.

function printifcol {
    local descCol="$3";
    local valueCol="$6";
    if [[ "xyz" == "${descCol}" ]]; then
        echo "${valueCol}";                               
    fi                       
}
export -f printifcol;
csvtool call printifcol file.csv

두 경우 모두 (역방향) 옵션을 사용하여 sort출력을 명령으로 파이프하여 -r내림차순으로 정렬할 수 있습니다.

awk -F, '$3 ~ /xyz/ {print $6}' file.csv | sort -r
 
# assumes function was already exported
csvtool call printifcol file.csv | sort -r

관련 정보