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);
并打印,
+ 日期 + 空格和当前字段值。