如何格式化复杂的大文本文件并删除多种类型的字符
How do I format a complex large textfile and remove multiple types of characters
背景:
我正在处理这个巨大的文本文件:http://openweathermap.org/help/city_list.txt
前十行如下所示,\t
代表文件中的一个选项卡:
id\tnm\tlat\tlon\tcountryCode
819827\tRazvilka\t55.591667\t37.740833\tRU
524901\tMoscow\t55.752220\t37.615555\tRU
1271881\tFirozpur Jhirka\t27.799999\t76.949997\tIN
1283240\tKathmandu\t27.716667\t85.316666\tNP
703448\tKiev\t50.433334\t30.516666\tUA
1282898\tPokhara\t28.233334\t83.983330\tNP
3632308\tMerida\t8.598333\t-71.144997\tVE
1273294\tDelhi\t28.666668\t77.216667\tIN
502069\tReshetnikovo\t56.450001\t36.566666\tRU
我想删除此文本文件中除名称(城市 ID 后的第二个选项卡元素)之外的所有字符
目前我尝试过的:
- 查找 [0-9]+ 并将其替换为“”:发现于 (Remove Numbers in Notepad++)
- 查找“-”并将其替换为“”
- 查找并替换“.”与“”
什么我想不通
- 我需要删除所有多余的 space,但我找不到 space 并将其替换为“”,因为某些名称中包含 space。
- 我需要删除国家/地区代码(例如 RU、UK、US 等),也许可以使用一些正则表达式找到连续的 2 个字母并将其删除?
我努力后的文件当前状态(小提取)
Ciudad Bolivar VE
Marfino RU
Zhukovskiy RU
Reutov RU
Kurovskoye RU
Zheleznodorozhnyy RU
Golitsyno RU
Petrozavodsk RU
Saint Petersburg RU
Klimovsk RU
Novosibirsk RU
Donetsk UA
Istra RU
Bakhchysaray UA
Chekhov RU
Lyubuchany RU
Vostryakovo RU
Boryspil UA
如果您使用 cut -f2
或 awk -F $'\t' '{print }'
,您就完成了全部工作。两者都打印制表符分隔文件中的第二列。
否则,您可以使用 Bash 和:
sed $'s/^[^\t]*\t\([^\t]*\)\t.*/\1/'
使用 Bash 的 ANSI C quoting 生成正则表达式。 $'…'
包含 ANSI C 引用字符串。然后正则表达式匹配行首、零个或多个非制表符、制表符、开始记忆、零个或多个非制表符、停止记忆、制表符和行中的任何其他内容,并仅用记住的文本替换它。这是文件第 2 列中的城市名称。
这样写会更容易:
sed "s/^[^⎵]*⎵\([^⎵]*\)⎵.*//"
我在这里使用 ⎵
来表示一个选项卡。要在命令行键入制表符,您可能需要使用 Control-VControl-I 来输入每个制表符(因为 Bash 否则将选项卡视为文件名完成)。
如果您想使用 Notepad++ 执行此任务,请使用以下正则表达式进行简单的搜索和替换:
[0-9]+\t([-A-Za-z ]+)\t-?[0-9]+\.[0-9]+\t-?[0-9]+\.[0-9]+\t[A-Z]{2}
并替换为</code>。</p>
<p>或者,从命令行:</p>
<pre><code>perl -pe "s/[0-9]+\t([-A-Za-z ]+)\t-?[0-9]+\.[0-9]+\t-?[0-9]+\.[0-9]+\t[A-Z]{2}//" city_list.txt > city_list_clean.txt
背景: 我正在处理这个巨大的文本文件:http://openweathermap.org/help/city_list.txt
前十行如下所示,\t
代表文件中的一个选项卡:
id\tnm\tlat\tlon\tcountryCode
819827\tRazvilka\t55.591667\t37.740833\tRU
524901\tMoscow\t55.752220\t37.615555\tRU
1271881\tFirozpur Jhirka\t27.799999\t76.949997\tIN
1283240\tKathmandu\t27.716667\t85.316666\tNP
703448\tKiev\t50.433334\t30.516666\tUA
1282898\tPokhara\t28.233334\t83.983330\tNP
3632308\tMerida\t8.598333\t-71.144997\tVE
1273294\tDelhi\t28.666668\t77.216667\tIN
502069\tReshetnikovo\t56.450001\t36.566666\tRU
我想删除此文本文件中除名称(城市 ID 后的第二个选项卡元素)之外的所有字符
目前我尝试过的:
- 查找 [0-9]+ 并将其替换为“”:发现于 (Remove Numbers in Notepad++)
- 查找“-”并将其替换为“”
- 查找并替换“.”与“”
什么我想不通
- 我需要删除所有多余的 space,但我找不到 space 并将其替换为“”,因为某些名称中包含 space。
- 我需要删除国家/地区代码(例如 RU、UK、US 等),也许可以使用一些正则表达式找到连续的 2 个字母并将其删除?
我努力后的文件当前状态(小提取)
Ciudad Bolivar VE
Marfino RU
Zhukovskiy RU
Reutov RU
Kurovskoye RU
Zheleznodorozhnyy RU
Golitsyno RU
Petrozavodsk RU
Saint Petersburg RU
Klimovsk RU
Novosibirsk RU
Donetsk UA
Istra RU
Bakhchysaray UA
Chekhov RU
Lyubuchany RU
Vostryakovo RU
Boryspil UA
如果您使用 cut -f2
或 awk -F $'\t' '{print }'
,您就完成了全部工作。两者都打印制表符分隔文件中的第二列。
否则,您可以使用 Bash 和:
sed $'s/^[^\t]*\t\([^\t]*\)\t.*/\1/'
使用 Bash 的 ANSI C quoting 生成正则表达式。 $'…'
包含 ANSI C 引用字符串。然后正则表达式匹配行首、零个或多个非制表符、制表符、开始记忆、零个或多个非制表符、停止记忆、制表符和行中的任何其他内容,并仅用记住的文本替换它。这是文件第 2 列中的城市名称。
这样写会更容易:
sed "s/^[^⎵]*⎵\([^⎵]*\)⎵.*//"
我在这里使用 ⎵
来表示一个选项卡。要在命令行键入制表符,您可能需要使用 Control-VControl-I 来输入每个制表符(因为 Bash 否则将选项卡视为文件名完成)。
如果您想使用 Notepad++ 执行此任务,请使用以下正则表达式进行简单的搜索和替换:
[0-9]+\t([-A-Za-z ]+)\t-?[0-9]+\.[0-9]+\t-?[0-9]+\.[0-9]+\t[A-Z]{2}
并替换为</code>。</p>
<p>或者,从命令行:</p>
<pre><code>perl -pe "s/[0-9]+\t([-A-Za-z ]+)\t-?[0-9]+\.[0-9]+\t-?[0-9]+\.[0-9]+\t[A-Z]{2}//" city_list.txt > city_list_clean.txt