如何删除管道符号和其中的字符并修剪毫秒并用逗号分隔显示



My String is

e5c1640ed000f865fb3acf675be3cda4 26/06/2018 14:43:41.935216|19*.***.***.**9| 14:45:41.971271|19*.***.***.**9|

预期输出为

e5c1640ed000f865fb3acf675be3cda4,26/06/2018 14:43:41,26/06/2018 14:45:41

我试过这个,但在做完cut -d. -f-1后它被修剪了整套

您能否尝试按照awk进行操作,并让我知道这是否对您有帮助。

awk -F"[| .]" '{print $1","$2,$3","$2,$10}' Input_file

解决方案二:sed

sed 's/([^ ]*) ([^ ]*) ([^.]*).([^ ]*) ([^.]*).*/1,2 3,2 5/' Input_file

你可以试试这个sed

sed -E '
s/([^ ]*) ([^ ]*)(([^|]*|){2})(.*)/1,23,25/
s/(.([^|]*|){2})//g
' infile

首先根据需要
插入日期和逗号 其次删除以"|"开头并以"|"结尾的每个字符串

您可以使用

awk -F"[ |]+" 'BEGIN {ORS=""} {
print $1;
dt=$2;
for(i=3;i<=NF;i++) { 
if ($i~/^[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]+$/) {
sub(/..*/, "", $i);
print "," dt " " $i;
}
} 
}'
# => e5c1640ed000f865fb3acf675be3cda4,26/06/2018 14:43:41,26/06/2018 14:45:41

请参阅在线演示。

它假设应始终保留第一个字段,第二个字段始终是在每个找到的时间值之前"重复"的日期。

字段分隔符为[ |]+、 1 个或多个空格或管道。BEGIN {ORS=""}有助于在一行上输出结果。print $1;打印第一个字段,dt=$2;将日期保存到变量中,然后我们从第三个字段 (for(i=3;i<=NF;i++)( 开始迭代字段,如果字段值与模式 (/^[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]+$/匹配<2-digits>:<2-digits>:<2-digits>.<1+digits>则删除所有以.开头到值末尾的文本sub(/..*/, "", $i);并打印,+ 日期 + 空格和当前字段值。

最新更新