3

如何在 Windows 下更改非常大的日志文件:

   3334-444-(4) 任何东西 任何东西2
   4444-444-(4) 任何东西 任何东西2
   4744-454-(4) 任何东西 任何东西2
   48444 44-(4) 任何东西 任何东西2
   8444-444-(4) 任何东西 任何东西2
   4464-(444)-2 任何东西 2

对此:

33344444 任何东西 任何东西2
44444444 任何东西2
47444544 任何东西2
48444444 任何东西 任何东西2
84444444 任何东西 任何东西2
44644442 任何东西 任何东西2

删除除数字之外的每行第 18 位的所有内容并保留第二列的位置?

\\Edit:问题是从位置 1 到 17 也可能是数字之间的空格。这是我认为可能有效的逻辑:
1. 从 pos。1 到 17 将 '(', ')', '-' 替换为 ' ' [空格]
2. 从 pos. 1 到 17 将 ' ' [space] 替换为 '' [nothing] 并计数更改
3. 从 pos. 1 到 17 根据上一步的每次更改在数字后添加空格

4

6 回答 6

1

好吧,如果您安装cygwin,您可以使用命令行工具的强大功能

$ sed 's/[-)(]//g' input
33344444  anything   anything2
44444444  anything   anything2
47444544  anything   anything2
48444444  anything   anything2
84444444  anything   anything2
44644442  anything   anything2

更新

有时将复杂的任务分成更小的部分更容易。

假设输入看起来像这样(添加标尺)

         1         2         3         4         5
12345678901234567890123456789012345678901234567890
   3334-444-(4)  anything   anything2
   4444-444-(4)  anything   anything2
   4744-454-(4)  anything   anything2
   48444 44-(4)  anything   anything2
   8444-444-(4)  anything   anything2
   4464-(444)-2  anything   anything2

第 1 步是使用cutto well,剪掉前 17 个字符,删除不需要的字符并存储在 tmp-file 中。

第 2 步是将字符 18 剪切到行尾并存储在 tmp 文件中。

第 3 步是将 tmp 文件合并为一个文件。

像这样的东西:

$ cut -c1-17 input | sed 's/[-)( ]*//g' > c1

$ cut -c18- input > c2

$ paste c1 c2

如果这不符合您的审美,您可以使用awk. 将以下行放入名为“col.awk”的文件中,或者如果您喜欢它,请选择一个更好的名称:

{
  x = substr($0, 0, 17)
  y = substr($0, 18, length($0))
  gsub(/[-)( ]*/, "", x)
}
{ printf "%-18s%s\n", x, y }

然后这样称呼它:

$ awk -f col.awk input

输出(再次使用标尺):

         1         2         3         4         5
12345678901234567890123456789012345678901234567890
33344444         anything   anything2
44444444         anything   anything2
47444544         anything   anything2
48444444         anything   anything2
84444444         anything   anything2
44644442         anything   anything2

请注意,cygwin 喜欢所有具有 unix 样式的行尾,因此您可能需要将输入从 windows 样式转换为 unix 样式。一种可能对您有所帮助的工具是dos2unixfromdos(谷歌是您的朋友)。

于 2013-04-12T12:34:49.283 回答
0

真的,不确定,Windows可以做到这么简单。

但..

您可以安装Perl- 用于文本和字符串操作的良好语言。

或者找linux机器。

在这里你可以找到安装程序:草莓

安装后,只需在控制台中运行它 ( cmd.exe)

perl -i.bak -ne 's/^\s// && s/[-()]//g && s/\s/\t/; 打印;' 输入.txt

这将保存您的备份文件 ( input.txt.bak) 并获得input.txt文件中的更改。

于 2013-04-12T14:08:43.333 回答
0

使用下面的正则表达式并替换为“”(空字符串)

[-\(\)]

希望能帮助到你。

于 2013-04-12T12:33:29.687 回答
0

你可以试试 Ultra Edit。它是一个允许您在列模式下选择的编辑器,因此您可以选择前 18 个字符并以这种方式进行替换。

唯一想到的另一件事是使用具有宏功能的编辑器来执行此操作。

或者编写一个快速而肮脏的程序。

于 2013-04-12T12:32:32.320 回答
0

下载记事本++。打开文档并按 CTRL+h 进行搜索和替换。

在“查找内容”框中使用此正则表达式:

^([0-9]+)\-?\(?([0-9]+)\)?\-?\(?([0-9]+)\)?

这在“替换为”框中:

\1\2\3

在搜索模式中选择“正则表达式”,然后全部替换。

于 2013-04-12T12:47:17.630 回答
0

使用 sed:

sed -E ':a;s/^([0-9]*)([( ]|-\(?|\)-?)([0-9]+)\)?/\1\3/;ta;s/[ \t]+/         /;' file
于 2013-04-12T14:17:25.740 回答