大多数'符合某种条件的线条

时间:2016-05-20 21:14:59

标签: shell awk grep

我有1600万行数据文件,我正在使用它作为回归测试/重播工具的一部分。数据有很多类似的线。我想从文件中删除许多类似的行

档案格式为

|DATA|DATA|DATE|3|DATA|DATA
|DATA|DATA|DATE|3|DATA|DATA
|DATA|DATA|DATE|3|DATA|DATA
|DATA|DATA|DATE|2|DATA|DATA
|DATA|DATA|DATE|4|DATA|DATA
|DATA|DATA|DATE|2|DATA|DATA
|DATA|DATA|DATE|2|DATA|DATA

该文件为1600万行,第4个元素为2,3或10行的行组成1300万行。第4个元素为2,3或10的行都是相似的,所以我想从文件中删除90%的行。为了获得一些消息类型的计数,我能够运行此命令来查找第4个元素为3

的所有行
awk -F"|" '$4=="3"' capture.txt > out.txt 

这条线是我用来确定最常见消息的可重复性但是它没有帮助我修剪那些记录。我真正想要的是能够创建一个包含

的新文件
    (All records where pipe deliminated 4th element is not 2, 3 or 10) +
    (1 out of every 10 records where the 4th element is 2, 3 or 10)

这可以在一次通过文件吗?我想我可以创建两个文件,将第4个元素2,3或10的记录与具有不同第4个元素的记录分开。然后我可能会从一个文件中删除每10行并将它们重新组合在一起。但我真正的偏好是在一次通过中执行此操作并保留原始文件顺序。

有什么想法?

2 个答案:

答案 0 :(得分:4)

也许随机方法会更好。

awk -F'|' 'BEGIN{srand()} $5~/^(2|3|10)$/{if(rand()<0.1) print; next}1' file

将有10%的机会打印这些线,您可以设置种子以使其可重复。请注意,您应该检查第五个字段,而不是第四个字段。

答案 1 :(得分:0)

您提供的样本输入的常量字符串“DATE”为$ 4,但$ 5有2,3和4,所以您可能正在寻找类似的内容:

awk '$5 != 2 && $5 != 3 && $5 != 10 {print; next} a++%10 == 0' FS=\| input > output