gpt4 book ai didi

perl - 如何从重复超过六次的文件中打印行

转载 作者:行者123 更新时间:2023-12-01 00:57:16 25 4
gpt4 key购买 nike

很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .




9年前关闭。




我有一个包含如下数据的文件。第一个逗号分隔的字段可以重复任意次数,我只想打印该字段的任何值的第六次重复之后的行

例如,有 8 个字段为 1111111。作为第一个字段,我只想打印这些记录的第七和第八

输入文件:

1111111,aaaaaaaa,14
1111111,bbbbbbbb,14
1111111,cccccccc,14
1111111,dddddddd,14
1111111,eeeeeeee,14
1111111,ffffffff,14
1111111,gggggggg,14
1111111,hhhhhhhh,14
2222222,aaaaaaaa,14
2222222,bbbbbbbb,14
2222222,cccccccc,14
2222222,dddddddd,14
2222222,eeeeeeee,14
2222222,ffffffff,14
2222222,gggggggg,14
3333333,aaaaaaaa,14
3333333,bbbbbbbb,14
3333333,cccccccc,14
3333333,dddddddd,14
3333333,eeeeeeee,14
3333333,ffffffff,14
3333333,gggggggg,14
3333333,hhhhhhhh,14

输出:
1111111,gggggggg,14
1111111,hhhhhhhh,14
2222222,gggggggg,14
3333333,gggggggg,14
3333333,hhhhhhhh,14

我尝试的是相对于第 1 转调第 2 和第 3 字段,以便我可以使用 nawk$7 的领域或 $8
#!/usr/bin/ksh awk -F"," '{ a[$1]; b[$1]=b[$1]","$2 c[$1]=c[$1]","$3} END{ for(i in a){ print i","b[i]","c[i]} } ' file > output.txt

最佳答案

如果您的记录无序
即您可能在整个输入中随机分布“1111111”项:

$ awk -F, '++a[$1] > 6' input.txt
1111111,gggggggg,14
1111111,hhhhhhhh,14
2222222,gggggggg,14
3333333,gggggggg,14
3333333,hhhhhhhh,14
这是如何运作的?
如你所知,awk 的 -F选项设置分隔符。如果它不是特殊字符,则没有迫切需要引用它。
awk 脚本由一系列 condition { action; } block 组成。 .如果条件缺失,则对每一行应用操作。如果缺少该操作,则暗示为 print; .因此,仅包含一个条件的 awk 脚本将打印该条件评估为真的每个输入行。
在这种情况下,我们的条件也有一个 Action 的元素。它增加了关联数组的元素,其中键是您的第一个字段。无论条件评估是否为真,都会发生增量。另外,把 ++提前而不是跟随变量会导致增量发生在评估之前而不是之后。 (我说的是 ++varvar++ 之间的区别。)如果结果递增的数组元素大于 6,则条件评估为真,从而导致打印行。
这在功能上等同于 perl其他答案中的解决方案,但由于 awk 脚本的性质,它甚至更严格并且(可以说)更简单。当然,它可能会更快。 (在我刚才的非正式测试中,上面的 awk 脚本的执行速度是另一个答案的等效 perl 脚本的两倍多,在 0.23 秒的用户时间内处理 250000 行输入,而在 perl 中处理 0.61 秒。)
如果您的记录被订购
即您所有的“1111111”行都在一起:
$ awk -F, '$1!=f{c=0;f=$1} ++c>6' input.txt
1111111,gggggggg,14
1111111,hhhhhhhh,14
2222222,gggggggg,14
3333333,gggggggg,14
3333333,hhhhhhhh,14
这是如何运作的?
  • 如果我们使用的 $1 与上次不同(在第一行也是如此),我们将重置计数器并将 $1 保存到变量中以供将来比较。
  • 然后我们增加计数器并在计数器超过 6 时打印该行(隐式)。

  • 这具有不占用数组内存的优点,但仅适用于您的目标是匹配具有公共(public) $1 的连续行集,而不是处理可能在整个输入中随机分布的匹配行。

    关于perl - 如何从重复超过六次的文件中打印行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12300096/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com