【问题标题】:How to edit output rows from awk with defined position?如何使用定义的位置从 awk 编辑输出行?
【发布时间】:2020-12-31 21:28:28
【问题描述】:

有没有办法解决这个问题?

我有一个 bash 脚本,它从源文件创建 .dat 和 .log 文件。 我正在使用awk 打印并定位我需要打印的内容。问题在于最后一个位置 - ID2(较低)。它应该只是\*[0-9]{3}\*#,但在某些情况下[0-9]{12}\[00]\> 之前有一个字符串。 然后行看起来像这样:

2020-01-11 01:01:01;test;test123;123456789123[00]>*123*#

我需要的是删除文件中之前的字符串:

2020-01-11 01:01:01;test;test123;*123*#

文件结构:

YYYY-DD-MM HH:MM:SS;string;ID1;ID2

如果有任何建议,我会很高兴,谢谢。

【问题讨论】:

    标签: string bash awk printing row


    【解决方案1】:

    您能否尝试在 GNU awk 中使用所示示例进行测试和编写。

    awk '
    match($0,/[0-9]{12}\[[0-9]+\]>/) && /\*[0-9]{3}\*#/{
      print substr($0,1,RSTART-1) substr($0,RSTART+RLENGTH)
    }
    '  Input_file
    

    说明:为上述添加详细说明。

    awk '                                                        ##Starting awk program from here.
    match($0,/[0-9]{12}\[[0-9]+\]>/) && /\*[0-9]{3}\*#/{         ##Using match function to match regex in it, what regex does is: It matches digits(12 in number) then [ then digits(continuously coming) and ] Also checking condition if line ends with *3 digits *
      print substr($0,1,RSTART-1) substr($0,RSTART+RLENGTH)      ##If above condition is TRUE then printing sub-string from 1st character to RSTART-1 and then sub-string from RSTART+RLENGTH value to till last of line.
    }
    '  Input_file                                                ##Mentioning Input_file name here.
    

    【讨论】:

    • 我试过了,但它只返回行,其中 ID2 = *[0-9]{3}*#。
    • @OndřejČejka,显示的样本对我来说效果很好,我已经详细解释了它,如果你在其中找到任何东西,请告诉我,它是按照显示的样本和条件写的,只有欢呼.
    【解决方案2】:
    awk 'BEGIN{FS=OFS=";"} {$NF=substr($NF,length($NF)-5)}1' file
    

    这里我们只保留最后一个字段的最后 6 个字符,而分号是字段分隔符。如果*ID*# 前面没有其他内容,那么我们保留所有内容。

    【讨论】:

      【解决方案3】:

      删除第一个 * 之前的所有内容:

      $ awk 'BEGIN{FS=OFS=";"}{sub(/^[^*]*/,"",$NF)}1' file
      

      输出:

      2020-01-11 01:01:01;test;test123;*123*#
      

      【讨论】:

      • 这行得通,不幸的是它揭示了一个错误,其中 ID2 中的值也可以只是“1”、“2”、“3”..
      • 没有错误,因为这会暗示错误的代码。该脚本符合您对“ID2”的定义,如果您向其提供不符合您自己定义的数据,它会产生可能会或可能不会满足您的输出。也就是说,我自己会使用@thanasisp 的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2016-01-02
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 2017-12-31
      • 1970-01-01
      • 2018-03-27
      相关资源
      最近更新 更多