我有一个 CSV 文件,如下所示:
miami,20,in
lansing,2,cm
austin,3,mm
chicago,5,miles
phoenix,2,feet
第一个字段是名称,下一个字段是数值,第三个字段表示单位。我列出了数据集当前拥有的所有单位,但并不限于这些单位,因为我预计数据集会随着时间的推移而改变并需要不同的测量单位。
我希望能够在脚本中处理此 CSV 文件,以便将我的所有值转换为一个通用单位(英寸),并与名称一起列出。所以它应该看起来像这样:
miami,20
lansing,0.78740157
austin,0.11811024
chicago,316800
phoenix,24
我发现有一个单位转换工具units
正是我正在寻找的用于转换我的单位的工具,因为我的数据包含公制和英制单位的混合。
例如,如果我想将最后一行数据转换为英寸,我会这样做
units 2cm in -t
这会给我
0.78740157
我目前正在寻求帮助的是如何在脚本中使用此命令并以我描述的格式输出它(第二个代码块)。 CSV 数据当前存储$citydata
在 bash 脚本中调用的变量中。目前它是一个字符串。
答案1
这是一个线性的awk命令:
$ awk -F, '{system("printf " $1 ",;units " $2$NF " in -t ")}' file
miami,20
lansing,0.78740157
austin,0.11811024
chicago,316800
phoenix,24
system
命令调用命令中的另一个 shell 命令awk
。因此,首先打印 SCV 文件的第一个字段,"printf " $1 ",
后跟一个逗号,
;然后使用第二个和最后一个字段作为输入调用该units
命令。$2
$NF
笔记当你想system
在 中使用命令时awk
,你必须将这些命令及其选项用双引号括起来,awk
其中的选项除外。
答案2
你可以这样做:
#!/usr/bin/env bash
## The data is in the $citydata array
citydata=( $(cat file) )
## For each element of the array
for i in "${citydata[@]}"
do
## Read the fields, splitting on commas
IFS="," read -r city val unit <<<"$i"
## Print out the city and the value converted to inches
echo "$city,$(units $val$unit in -t)"
done
给定示例中的数据,上面的结果会产生
miami,20
lansing,0.78740157
笔记
- 该脚本期望每行包含三个以逗号分隔的字段。
- 嵌套逗号会破坏它,例如
"Washington, DC",20,cm
. - 它可以处理任何
units
可以转换的单位。
答案3
如果您想使用units
功能,很容易完成awk
awk -F, -v OFS=, '{"units "$(NF-1)$NF" in -t"|getline $(NF-1);NF=NF-1}1'