CSV 파일에서 특정 국가에 대해 가장 높은 값을 가진 가장 큰 행을 찾습니다.

CSV 파일에서 특정 국가에 대해 가장 높은 값을 가진 가장 큰 행을 찾습니다.

다음 항목이 포함된 .csv 파일이 있습니다.

Location,Indicator,Period,First Tooltip
Afghanistan,Malaria incidence (per 1 000 population at risk),2018,29
Afghanistan,Malaria incidence (per 1 000 population at risk),2017,27
Afghanistan,Malaria incidence (per 1 000 population at risk),2016,26
Afghanistan,Malaria incidence (per 1 000 population at risk),2015,15
Afghanistan,Malaria incidence (per 1 000 population at risk),2002,104
Afghanistan,Malaria incidence (per 1 000 population at risk),2001,92
Afghanistan,Malaria incidence (per 1 000 population at risk),2000,96
Algeria,Malaria incidence (per 1 000 population at risk),2018,0
Algeria,Malaria incidence (per 1 000 population at risk),2017,0
Algeria,Malaria incidence (per 1 000 population at risk),2013,0


쉘 스크립트에서 반환된 인수 로 국가 이름을 제공하고 다음을 출력하는 쉘 스크립트를 작성하고 싶습니다 .

./scrip.sh Afghanistan  
For Afghanistan, the year is 2002; the rate is 104 per 1,000  

기본적으로 해당 국가에 대해 최대 도구 설명이 있는 행을 선택한 다음 구문 분석하여
위의 출력을 생성합니다.

내 생각:
쉘 스크립트를 사용하여 이 작업을 수행하는 방법을 모르겠습니다.
여기에는 두 부분이 있습니다. 첫 번째 부분은 최대값을 선택하고
행을 분할한 후 값을 찾아서 인쇄하는 것입니다.
진행 방법에 대한 팁이나 아이디어

답변1

쉘+awk:

#!/usr/bin/env sh

country="$1"

if [ -z "$country" ]
then
    printf "Country not specified\n" >&2
    exit 1
fi


awk -v FS=, -v country="$country" '
    BEGIN { tooltip = 0; found = 0 }
    $1 == country { if ($NF > tooltip) {found = 1; tooltip = $NF; year = $(NF - 1)} }
    END {if (!found) {print "No entry for the specified country"; exit 1} print "For " country " the year is " year "; the rate is " tooltip " per 1,000"}' file.csv

파일 이름을 지정하지 않았으므로 file.csv.

$ ./script.sh Afghanistan
For Afghanistan the year is 2002; the rate is 104 per 1,000
$ ./script.sh abc
No entry for the specified country

답변2

사용sed

$ cat script.sh
#!/usr/bin/env bash

sed 's/ \+\([^,]*\),[^(]*(\([^0-9]*[0-9 ]*\)[^,]*,\([^,]*\),\(.*\)/For \1, the year is \3; the rate is \4 \2/' <(sed -n "/$1/p" input_file | sort -t',' -rnk4 | head -1)
$ ./script.sh Afghanistan
For Afghanistan, the year is 2002; the rate is 104 per 1 000

답변3

제안된 솔루션 awk:

스크립트 파일

#!/bin/bash
grep "$1" input.csv|sort -n -k 3 -t ","|tail -1|awk -F, '{gsub(" ","",$1);printf "For %s, the year is %d; the rate is %d per 1,000\n",$1,$3,$4}'

답변4

다음은 원하는 작업을 수행하는 Perl 스크립트입니다. 나중에 추가 정보가 필요할 경우 쉽게 확장할 수 있습니다. 이는 지난 15년 정도의 모든 Unix/Linux 시스템의 모든 Perl 시스템에서 작동해야 합니다.

#!/usr/bin/env perl

use 5.010;
use warnings;
use strict;

my $country = shift // die "Usage: $0 <country>\n";

my @rows = sort { $b->[3] <=> $a->[3] } 
           grep { $_->[0] eq $country } 
            map { chomp;[ split ',' ] } <>;

die "Country `$country' not found\n" if @rows == 0;

my $max = $rows[0];

say "For $country, the year is $max->[2]; the rate is $max->[3] per 1,000";

예제 출력:

For Afghanistan, the year is 2002; the rate is 104 per 1,000

스크립트는 STDIN 의 각 줄을 읽습니다 <>. , 아래에서 위로 수행 됩니다 map. 줄 바꿈( )이 제거되고 줄이 쉼표로 구분됩니다.grepsortmapchomp

그런 다음 국가( ; 첫 번째 열)가 와 같은 grep행을 검색합니다 .$_->[0]$country

마지막으로 sort네 번째 열을 기준으로 역순으로 정렬합니다. ( $_->[3]). 이제 모든 행이 있습니다. 예를 들어 아프가니스탄 행이 있고 가장 높은 값을 가진 행이 맨 위에 있습니다.

이제 쉽습니다. $max첫 번째 줄( ) 만 설정 $rows[0]하고 원하는 문자열을 출력할 수 있습니다.

관련 정보