shell 脚本的命令行不起作用

shell 脚本的命令行不起作用

我正在尝试将单行命令转换为脚本,以便可以从调度程序调用它。但是当我在 bash 中运行时该命令可以正常工作,而当我在 shell 脚本中运行它时,bot 无法正常运行。

我在文件 $FILE1 中有以下数据

1,Date,Country,Europe,6
2,Date,Country,America,22
3,Date,Country,America,22
4,Date,Country,Asia,9
5,Date,Country,Australia,29

我的预期输出是仅输入超过 20 个的国家/地区名称和数字,并且仅输入唯一值,例如:

America, 22 MILLION
Australia, 29 MILLION

这是我的代码,它没有给我唯一的值,而是给我所有重复的值

#This will only pull Country column i.e. America, Australia and so on...
grep "Country" FILE1|cut -f4 "," > $FILE2


#This will use the keyword America from FILE2 and search in FILE1 for associated count and copy in FILE3
for i in $(cat $FILE2);
do
     cat $FILE1|grep "Country"|grep $i|echo $i, `wc -l` MILLION >> $FILE3;
done;


#Now that we have both country name and count...we will find countries only with >20 count
for a in $(cat $FILE3);
do
    awk -F "," '$2 > 20' $FILE3 |sort -u > $FILE4
done;


#Send the final file to email
echo "Here is the data"|mailx -s "Population data" -a FILE4 user@email

我的第二个问题是,我如何以一种好的方式格式化......例如我想写“

America has more than 22 million population
Australia has more than 29 million population

代替

America, 22 million
Australia, 29 million

谢谢。抱歉,如果这是一个基本问题...我刚刚开始使用 Unix 脚本。

答案1

您可以将整个文本处理任务合并到一个awk程序中:

awk -F',' '($5>20)&&(!seen[$4]++){printf "%s has more than %d million inhabitants\n",$4,$5}' data.csv

这会将文件解析为 CSV 文件,检查第 5 个字段以检查它是否大于 20,并保留内部发生计数器seen以确保尚未遇到国家/地区名称。仅当两个条件都满足时,它才会打印由字段 4 和 5 中的信息组装而成的所需字符串。

要将其包含在 shell 脚本中:

awk -F',' '($5>20)&&(!seen[$4]++){printf "%s has more than %d million inhabitants\n",$4,$5}' "$file1" > "$file4"

作为旁注,这是一个很好的做法不是对 shell 变量使用全大写名称,除非要将它们导出为环境变量,并确保正确引用 shell 变量以防止不必要的分词。

我建议调查一下GreyCat&Lhunath 的 Bash 指南有关 shell 脚本编写的更多信息。另外,考虑安装外壳检查,这将有助于捕获 shell 脚本中的许多语法错误。

相关内容