在 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

我想编写一个 shell 脚本,给出一个国家/地区名称作为 shell
脚本返回的参数,并输出如下:

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

基本上,对于该国家/地区,选择具有 max Tooltip 的行,然后对其进行解析以生成
上述输出。

我的想法:
我不知道如何使用 shell 脚本来做到这一点。
这里有两个部分,第一部分是选择最大值,然后一旦我们将该行
分割开来,找出数值并将其打印出来。
有关如何进行的任何提示或想法

答案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 的每一行<>。 、mapgrepsort按从下往上的顺序完成的:map删除换行符 ( chomp) 并用逗号分隔行。

然后grep搜索国家/地区($_->[0];第一列)等于 的行$country

最后sort按第四列按相反的数字顺序排序。 ( $_->[3])。所以现在我们拥有所有的行,比如说阿富汗行,并且值最高的行位于顶部。

所以现在很容易了。我们可以只设置$max第一行($rows[0]),然后就可以输出你想要的字符串了。

相关内容