【问题标题】:Concatenate 2 lines with different fields filled连接填充了不同字段的 2 行
【发布时间】:2020-07-30 00:26:19
【问题描述】:

我正在格式化一个日志文件,我需要将其转换为 CSV,以便为上级制作一份报告。 在日志文件中,我得到如下内容:

Apr 15 15:51:41 server l2tps: [l2tp_l-22] RADIUS: Accounting user 'USER' (Type: 1)

Apr 15 15:51:35 server l2tps: [l2tp_l-22] RADIUS: Accounting user 'USER' (Type: 2)

在我正在处理的 CSV 中,我需要这样的东西:

    User |  Date  | Conected on | Disconected On | Connection Time
User     | 15-Apr |   15:51:35   |     15:51:41    |    00:00:06

我已经达到了这样的程度,即我有 2 行填充连接或断开连接时间,并用标签分隔字段。我已经按时间对线路进行了排序,所以在长长的列表中我的顺序是 Conection>Disconection>Conection>Disconection... 等等。

我不知道如何连接 2 个连续的行而不覆盖填充的字段。基本上我有两行这样的:

USER [TAB] 15-Apr [TAB] 15:51:35 [TAB] [TAB]

USER [TAB] 15-Apr [TAB] [TAB] 15:51:41 [TAB]

我需要把它变成:

USER [TAB] 15-Apr [TAB] 15:51:35 [TAB] 15:51:41 [TAB]

我这辈子都想不通。

TLDR:我有 2 行带有字段分隔数据的行,我需要将两行合并为一个有空白字段的行。我该怎么做?

有人可以帮我吗?

【问题讨论】:

  • 嗨拉斐尔,你的问题不清楚。请对其进行编辑以使其更清晰,并提及\tr是什么。
  • 完成。添加 TLDR 并将 \tr 更正为 [TAB]。

标签: csv awk text-processing


【解决方案1】:
awk '
    BEGIN{FS=OFS="\011"}  #Sets field separators to tab
    j{x=$4;$0=j;$4=x;j=0} #If j!=0, set line=j (the line before) and put the 4th field of this line in it
    $4~/^[ ]*$/{j=$0}     #If 4th field is empty, j=thisline
    !j                    #If j=0, print the line
' input

即使使用 cmets,如果您以前从未尝试过 awk,上述 sn-p 可能也很难掌握。随时要求澄清。


在这个输入文件上:

$ cat -T input
USER ^I 15-Apr ^I 15:51:35 ^I ^I
USER ^I 15-Apr ^I ^I 15:51:41 ^I

产生的输出是

$ cat -T <(./script)
USER ^I 15-Apr ^I 15:51:35 ^I 15:51:41 ^I

【讨论】:

  • 该死的,我需要什么!我一直在使用 awk,但我还是新手。直到现在还没有机会使用 BEGIN。谢谢我的男人!
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2018-08-23
  • 2011-11-02
相关资源
最近更新 更多