与Converting Height Measurements from Imperial to Metric units相关,但使用的方法不同。
我有一个数据集,其中有许多混合单位的值,尤其是以英制和公制单位测量高度。此外,无论出于何种原因,上述英制尺寸都包含过多的引号。
我曾认为,因为人们的身高相对受到限制,所以大规模的替换工作可能会起作用,而不是进行转换。例如,身高5英尺3英寸的人是160.02厘米,因此可以找到所有一个并将其替换为另一个。
考虑数据集test.csv中的这一行
"Female","Hispanic",25,"5' 11"""
我想用“ 180.34”替换“ 5'11””“。
我已经尝试过sed -i 's#"5' 1"""#"180.34"#g' test.csv
,但是唯一的输出结果是终端窗口中的>
字符,这表明我做错了什么,但还不太清楚。我缺少处理多余引号的东西吗?
答案 0 :(得分:2)
问题是sed表达式5' 1
中的单引号。
使用\x27
替换单引号:
sed -i 's#"5\x27 1"""#"180.34"#g' test.csv
答案 1 :(得分:2)
wrt Additionally, for whatever reason, said Imperial measurements contain an excess of quotation marks.
-当您以英尺和英寸为单位书写尺寸时,'
代表英尺,"
代表英寸。因此,将5英尺11英寸写为5' 11"
。在引用了"foo"
之类的字段的CSV中,您需要某种方式来包含"
,而在某些CSV格式(例如从Excel导出的格式)中,一种实现方式是将{{1 }。因此,在引用字段中包含"
就是foo"bar
。现在让我们回到"foo""bar"
-应用相同的逻辑,并将其包含在带引号的字段中,您可以将其写为5' 11"
,其中最后一个"5' 11"""
之前的""
是"
的转义表示形式,以包含在引用字段中。有关适用的CSV“标准”的参考以及有关使用标准UNIX工具awk解析CSV的更多信息,请参见What's the most robust way to efficiently parse CSV using awk?。
写了您的特定问题-而不是一次使用硬编码的值一次转换一个数字,而只是一次将它们全部通过算法转换。将GNU awk用于FPAT:
"
答案 2 :(得分:1)
在这种情况下,最简单的方法是
sed -i "s|\"5' 1\"\"\"|\"180.34\"|g" test.csv
答案 3 :(得分:1)
另一种方式:
sed -i 's/5'"'"' 11""/180.34/g' test.csv