与Converting Height Measurements from Imperial to Metric units相关,但使用了不同的方法。
我有一个数据集,其中有一些混合单位的值,特别是用帝国单位和公制单位来测量高度。此外,无论出于什么原因,帝国测量都包含了过多的引号。
我曾想过,当人们的身高相对受限时,一个大规模的寻找替代物可能会起作用,而不是进行转换。例如,一个人的5‘3英寸是160.02cm,所以它可以找到所有的一个,并替换为另一个。
考虑一下数据集test.csv中的这一行
"Female","Hispanic",25,"5' 11"""我想把"5‘11“改为"180.34”。
我尝试过sed -i 's#"5' 1"""#"180.34"#g' test.csv,但唯一的输出是终端窗口中的>字符,这表明我做错了什么,但不太清楚是什么。有什么东西我错过了处理多余的引号吗?
发布于 2018-10-16 09:13:14
最简单的方法是对sed字符串进行转义,在本例中:
sed -i "s|\"5' 1\"\"\"|\"180.34\"|g" test.csv发布于 2018-10-16 09:15:31
问题是sed表达式5' 1中的单引号。
使用\x27替换单引号:
sed -i 's#"5\x27 1"""#"180.34"#g' test.csv发布于 2018-10-16 13:57:03
wrt Additionally, for whatever reason, said Imperial measurements contain an excess of quotation marks. --当您以英尺和英寸编写度量值时,'表示英尺,"表示英寸。因此,5英尺11英寸是写5' 11"。在引用了像"foo"这样的字段的CSV中,您需要某种方式来包含",而在某些CSV格式(例如从"导出)中,一种方法是加倍"来转义它。因此,在引用的字段中包括foo"bar将是"foo""bar"。现在让我们回到5' 11" --同样的逻辑适用,并将其包含在引用的字段中,将其写为"5' 11""",其中最后一个"之前的""是包含在引用字段中的"的转义表示。有关使用标准UNIX工具awk解析CSV的更多信息,请参见What's the most robust way to efficiently parse CSV using awk?中对适用的CSV“标准”的引用。
wrt您的具体问题-而不是一次转换一个数字使用硬编码的值,只是在一次转换他们所有的算法。将GNU awk用于FPAT:
$ cat tst.awk
BEGIN {
FPAT = "([^,]*)|(\"[^\"]+\")"
OFS = ","
}
{
split($4,feetinches,/[^0-9]+/)
ft = feetinches[2] + (feetinches[3] / 12)
$4 = "\"" int( (10000 * ft / 3.28084) + 0.5 ) / 100 "\""
print
}
$ cat file
"Female","Hispanic",25,"5' 11"""
"Male","Scottish",54,"6' 1"""
"Female","English",12,"4' 7"""
"TBD","Martian",935,"8' 5"""
$ awk -f tst.awk file
"Female","Hispanic",25,"180.34"
"Male","Scottish",54,"185.42"
"Female","English",12,"139.70"
"TBD","Martian",935,"256.54"https://stackoverflow.com/questions/52831703
复制相似问题