![shell 脚本的命令行不起作用](https://linux22.com/image/188300/shell%20%E8%84%9A%E6%9C%AC%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我正在尝试将单行命令转换为脚本,以便可以从调度程序调用它。但是当我在 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 脚本中的许多语法错误。