如何格式化复杂的大文本文件并删除多种类型的字符

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 后的第二个选项卡元素)之外的所有字符

目前我尝试过的:

什么我想不通

我努力后的文件当前状态(小提取)

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 -f2awk -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