从文件中删除给定模式之间的行(使用Unix工具)

时间:2010-01-03 22:28:00

标签: unix lines

我有一个文本文件(更准确地说,是一个“德式”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,脚本会剪切与这些开始/结束对匹配的行以及它们之间的所有内容。< / p>

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

5 个答案:

答案 0 :(得分:20)

查看sed

sed '/start_pat/,/end_pat/d'

将删除start_patend_pat(含)之间的行。

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

sed -e '/s1/,/e1/d' -e '/s2/,/e2/d' -e '/s3/,/e3/d' ...

答案 1 :(得分: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运行文件来删除它们。

答案 2 :(得分:0)

你也使用awk

awk '/start/,/end/' file

答案 3 :(得分:0)

我会认真地建议学习perl的基础知识(即不是OO的东西)。它将在桶装中偿还你。

一旦掌握了基础知识,编写一些perl就可以快速而简单地执行此操作(以及许多其他此类任务),如果您习惯使用awk,sed,grep等非常简单。

您不必记住如何使用大量不同的工具,以及您之前使用多个工具来解决问题,您可以使用单个perl脚本(通常执行起来要快得多)。 / p>

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

(虽然sed很整洁: - )

答案 4 :(得分:-1)

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

对不起 - 以为你只想要最后没有0,000的行