8

我有一个文本文件(更准确地说,是一个“德式”CSV 文件,即分号分隔的十进制逗号),其中包含日期和每行的测量值。
在进一步工作之前,我想删除一些错误值。我想将这些剪辑存储在一些脚本中,以便记录我的更正,如有必要,我可以重播这些更正。

这些行看起来像这样:

28.01.2005 14:48:38;5,166
28.01.2005 14:50:38;2,916
28.01.2005 14:52:38;0,000
28.01.2005 14:54:38;0,000
(long stretch of values that should be removed; could also be something else beside 0)
01.02.2005 00:11:43;0,000
01.02.2005 00:13:43;1,333
01.02.2005 00:15:43;3,250

现在我想存储一个开始和结束模式的列表,例如28.01.2005 14:52:38+ 01.02.2005 00:11:43,脚本会剪切与这些开始/结束对匹配的行以及它们之间的所有内容。

我正在考虑破解一个 awk 脚本,但也许我错过了一个已经存在的工具。

4

5 回答 5

24

看看sed

sed '/start_pat/,/end_pat/d'

将删除start_patend_pat(包括)之间的行。

要删除多个这样的对,您可以将它们与多个-e选项结合使用:

sed -e '/s1/,/e1/d' -e '/s2/,/e2/d' -e '/s3/,/e3/d' ...
于 2010-01-03T22:34:18.030 回答
0

首先,为什么你需要记录你所做的事情?为什么不保留原始文件的备份,或者在新旧文件之间进行比较,或者将其置于源代码控制之下?

对于实际的更改,我建议使用 Vim。

Vim:global命令(缩写为:g)可用于在匹配正则表达式的行上运行 :ex 命令。这在许多方面比 awk 更强大,因为这些命令可以引用与匹配行相关的范围,而且您可以使用 Vim 的全文处理能力。

例如,这将做一些接近你想要的事情(未经测试,所以告诫购买者):

:g!/^\d\d\.\d\d\.\d\d\d\d/ -1 write tmp.txt >> | delete

这匹配不以日期开头的行(!否定匹配),将前一行附加到文件 tmp.txt,然后删除当前行。

您可能会在 tmp.txt 中得到重复的行,但可以通过 uniq 运行文件来删除它们。

于 2010-01-03T23:24:28.523 回答
0

你也在使用 awk

awk '/start/,/end/' file
于 2010-01-04T00:37:04.893 回答
0

我会认真建议学习 perl 的基础知识(即不是 OO 的东西)。它会以桶装的方式回报你。

一旦你掌握了基础知识,编写一点 perl 来完成这个(以及许多其他类似的任务)是快速而简单的,如果你习惯于使用 awk、sed、grep 等,这非常简单。

您不必记住如何使用许多不同的工具,以及以前在哪里使用多个工具一起解决问题,您可以只使用一个 perl 脚本(通常执行速度要快得多)。

而且,现在几乎每个 unix/linux 发行版都安装了 perl。

(虽然 sed 很整洁 :-)

于 2010-01-04T00:46:58.933 回答
-1

使用 grep -L (打印不匹配的行)

抱歉 - 以为你只想要最后没有 0,000 的行

于 2010-01-03T22:31:42.437 回答