String 如何从定义了位置的awk编辑输出行?

String 如何从定义了位置的awk编辑输出行?,string,bash,awk,printing,row,String,Bash,Awk,Printing,Row,有没有办法解决这个问题 我有一个bash脚本,它从源文件创建.dat和.log文件。 我正在使用awk进行打印并定位需要打印的内容。问题在于最后一个位置-ID2(下部)。它应该是\*[0-9]{3}\*.,但在某些情况下,[0-9]{12}\[00]\>前面有一个字符串。 例如,row如下所示: 2020-01-11 01:01:01;test;test123;123456789123[00]>*123*# 我需要的是在文件中删除之前的字符串: 2020-01-11 01:01:01;t

有没有办法解决这个问题

我有一个bash脚本,它从源文件创建.dat和.log文件。 我正在使用
awk
进行打印并定位需要打印的内容。问题在于最后一个位置-ID2(下部)。它应该是
\*[0-9]{3}\*.
,但在某些情况下,
[0-9]{12}\[00]\>
前面有一个字符串。 例如,row如下所示:

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

我很乐意接受任何建议,谢谢。

请您尝试以下使用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.

请您尝试使用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.
这里我们只保留最后一个字段的最后6个字符,而分号是字段分隔符。如果该
*ID*#
前面没有其他内容,则我们保留所有内容


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

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

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

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

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

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

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

这是可行的,不幸的是,它揭示了一个错误,ID2中的值也可以是“1”、“2”、“3”。没有错误,因为这会导致错误代码。该脚本符合您对“ID2”的定义,如果您向其提供的数据与您自己的定义不符,那么它将生成您可能满意或不满意的输出。这就是说,我自己会使用@thanasisp的解决方案。这是可行的,不幸的是,它揭示了一个错误,ID2中的值也可以是“1”、“2”、“3”。没有错误,因为这会导致错误代码。该脚本符合您对“ID2”的定义,如果您向其提供的数据与您自己的定义不符,那么它将生成您可能满意或不满意的输出。也就是说,我自己会使用@thanasisp的解决方案。我尝试过这个,但它只返回行,其中ID2=*[0-9]{3}*.@OndřejČejka,在中显示的示例对我来说很好,我已经详细解释过了。如果您在其中发现任何内容,请务必让我知道,它是按照显示的示例和条件编写的,只让我高兴。我尝试过这个,但它只返回行,其中ID2=*[0-9]{3}*#。@OndřejČejka,显示的样本对我来说很好,我已经详细解释了,请务必让我知道,如果您在其中发现任何东西,它是根据显示的样本和条件编写的,只欢迎。