【问题标题】:Slice 3TB log file with sed, awk & xargs?使用 sed、awk 和 xargs 切片 3TB 日志文件?
【发布时间】:2012-05-22 01:36:15
【问题描述】:

我需要对几 TB 的日志数据进行切片,并且更喜欢命令行的速度。 我会在处理之前将文件分成块,但需要删除一些部分。

以下是格式示例:

uuJ oPz eeOO    109 66  8
uuJ oPz eeOO    48  0   221
uuJ oPz eeOO    9   674 3
kf iiiTti oP    88  909 19
mxmx lo uUui    2   9   771
mxmx lo uUui    577 765 27878456

前三个字母数字字符串之间之间的间隔是空格。之后的一切都是标签。行用\n分隔。

我只想保留每组的最后一行。

如果一个组中只有 1 行,则应保留。

这是预期的输出:

uuJ oPz eeOO    9   674 3
kf iiiTti oP    88  909 19
mxmx lo uUui    577 765 27878456

我如何使用 sed、awk、xargs 和朋友来做到这一点,还是应该只使用更高级别的东西,比如 Python?

【问题讨论】:

    标签: linux sed awk xargs


    【解决方案1】:
    awk -F '\t' '
      NR==1 {key=$1} 
      $1!=key {print line; key=$1} 
      {line=$0}
      END {print line}
    ' file_in > file_out 
    

    【讨论】:

    • 有了这个,我得到了一个相同的 infile 副本。请注意,行不能像对像一样进行比较,因为它们在字符串之后都包含不同的数字。与组中最后一项相关的数字将被保留。
    • @tripleee 是的,最后一行也被切断了。但格式仍然不正确 - 请参阅问题的预期输出部分。
    • 我删除了我的评论,因为我认为我弄错了;但它似乎毕竟是正确的:输出的最后一行丢失了。
    • 这个和另一个解决方案比较第一个制表符分隔的字段。如果您的输入中根本没有制表符,您会看到整个输入文件减去最后一行。您确定您的问题描述正确吗?
    • 感谢@tripleee - 我复制并粘贴了我的示例的 SO 版本(将制表符换成空格)进行测试。
    【解决方案2】:

    试试这个:

    awk 'BEGIN{FS="\t"}
        {if($1!=prevKey) {if (NR > 1) {print lastLine}; prevKey=$1} lastLine=$0}
        END{print lastLine}'
    

    它保存最后一行并仅在它注意到密钥已更改时打印它。

    【讨论】:

    • 这不会产生问题中的预期输出。每一行的数字都不一样,直接对比前几行总是会失败。
    • 是的,我也是。现在完美运行我已经修复了测试文件:)
    • key字段可以为空会有一个小bug;如果这对您的场景来说是个问题,您也许可以从这个和@glenn jackman 的解决方案中综合出一些东西。
    • @tripleee 我更改了条件,因此它也适用于空键(检查第一行而不是空键)。
    【解决方案3】:

    这可能对你有用:

     sed ':a;$!N;/^\(\S*\s\S*\s\S*\)[^\n]*\n\1/s//\1/;ta;P;D' file
    

    【讨论】:

      猜你喜欢
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 2021-05-01
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多