【发布时间】:2019-04-06 04:06:53
【问题描述】:
我正在创建一个 shell 脚本来分析输入文件并将结果发送到输出文件。这是来自输入文件的示例:
01,Rome,30,New York,70,
02,Los Angeles,5,New York,50,
03,New York,40,Tokyo,20,
04,Paris,5,New York,40,
05,New York,20,London,30,
06,Seattle,20,New York,40,
07,Chicago,10,New York,30,
08,New York,20,Miami,40,
这是我在输出文件中需要的结果:
01,Rome,30,New York,70,4th,40,
02,Los Angeles,5,New York,50,4th,45,
03,New York,40,Tokyo,20,2nd,20,
04,Paris,5,New York,40,4th,35,
05,New York,20,London,30,2nd,-10,
06,Seattle,20,New York,40,4th,20,
07,Chicago,10,New York,30,4th,20,
08,New York,20,Miami,40,2nd,-20,
字段用逗号分隔。
我打算在每行的第二个字段中搜索字符串“New York”,如果为真,则添加带有“2nd”的第 6 个字段,如果不为真,则添加值为“4th”的第 6 个字段
然后我打算使用第 3 和第 5 字段中的值进行减法运算。如果第 6 个字段中的字符串是“4th”,则从第 5 个字段中减去第 3 个字段。如果第 6 个字段中的字符串是“2nd”,则从第 3 个字段中减去第 5 个字段。计算结果需要是每行第7个字段。
我尝试过 awk、sed、grep、echo 和 bc 的组合,但我觉得我想多了。有什么建议吗?
编辑:到目前为止我的进展 - 我认为单独评估和附加每一行会效率低下。
while read line; do
echo "$(cut -f2 -d ",")"
done < input.txt
打印每行的第二个字段,但我很难评估字符串并将行附加到循环中。对于减法部分,我的计划是使用 echo 和 pipe 值来 bc,但我目前卡在第一步。
【问题讨论】:
-
欢迎来到 SO。 Stack Overflow 是一个面向专业和爱好者程序员的问答网站。目标是您将一些自己的代码添加到您的问题中,以至少显示您为解决这个问题所做的研究工作。
-
这对于 awk 来说看起来很容易。使用
,逗号作为字段分隔符,然后写列比较if ($2 = "New York") { $6 = "2nd" } else { $6 = "4th" }看起来简单易行。 -
@KamilCuk 确实 awk 似乎最简单。
awk -F "," '{if ($2 == "New York") { $6 = "2nd" } else { $6 = "4th" } print $1","$2","$3","$4","$5","$6"," }' input.txt在第一部分为我工作。至于减法部分,是否可以在 if 语句中设置多个变量?我尝试了awk -F "," '{if ($2 == "New York") { $6 = "2nd" && NYpoints=$3 && OtherPoints=$5 } else { $6 = "4th" && NYpoints=$5 && OtherPoints=$3 } print $1","$2","$3","$4","$5","$6","($NYpoints - $OtherPoints) }' input.txt,但这会将第 6 个字段更改为整数。