다음을 수행하는 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 grep
및 sed
)가 작업에 가장 적합한 도구가 아닐 수 있습니다. 이 경우 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