我有一台使用 OpenStreet 地图的 Garmin Nuvi。Garmin 提供邮政编码,但苏格兰的邮政编码通常比现在的晚 2-3 年。OSM 不提供英国邮政编码,但邮局提供,并且可以免费下载。此文件不到 1GB。它有 16 列,其中我只想要前 3 列。
我使用 cut 删除了多余的列,因此现在有了邮政编码、纬度和经度。不幸的是,POI 文件应为纬度、经度和邮政编码,即第 1 列应为第 3 列。更糟糕的是,邮政编码必须用引号括起来,例如 EH9 1QG 和 SW12 1AB 应为“EH9 1QG”和“SW12 1AB”。
我相当笨拙地使用了 awk(看看我做了什么?):
awk 'BEGIN {FS="\t"; OFS=","} {print $2, $3, $1}' pc0.csv > pc.csv
它所做的只是在前面添加了 2 个空列。
如果能用电子表格来做就好了,但有超过 300 万行。
有什么想法吗?
这是我从 cut - pc0.csv 的输出中获得的结果。awk
命令给出的结果相同,但每行前面有两个逗号,以提供 2 个空列。
Postcode Latitude Longitude
AB1 0AA,57.101474,-2.242851
AB1 0AB,57.102554,-2.246308
AB1 0AD,57.100556,-2.248342
AB1 0AE,57.084444,-2.255708
AB1 0AF,57.096656,-2.258102
AB1 0AG,57.097085,-2.267513
AB1 0AJ,57.099011,-2.252854
AB1 0AL,57.101765,-2.254688
因此,使用上面的“剪切”文件(现在只有 73MB),我需要将其转换为:
Latitude,Longitude,Postcode
57.101474,-2.242851,"AB1 0AA"
57.102554,-2.246308,"AB1 0AB"
57.100556,-2.248342,"AB1 0AD"
57.084444,-2.255708,"AB1 0AE"
57.096656,-2.258102,"AB1 0AF"
57.097085,-2.267513,"AB1 0AG"
57.099011,-2.252854,"AB1 0AJ"
57.101765,-2.254688,"AB1 0AL"
现在我必须删除制表符才能显示这些行,所以这又是一个问题,因为只能有逗号而没有其他东西 - 甚至没有空格,除非在引号内。
PS Linux(Ubuntu Mate)22.04 LTS
使用任何 awk 都会将您显示的第一个示例文件转换为您显示的第二个示例文件:
例如给出这个输入:
它产生这个输出:
如果这不是您所需要的,那么请澄清您的问题。
这可能适用于你的 Ubuntu 机器:
这个想法是在处理第一行之后重置
FS=","
并指定引号。duckdb cli是针对大文件运行此类任务的绝佳工具。
如果输入文件是这样的 TSV
你可以跑
获得此 CSV 输出