Как удалить символ трубы и символы внутри него и обрезать мс и отображать с разделителями-запятыми - PullRequest
0 голосов
/ 27 июня 2018

Моя строка

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

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Вы можете попробовать этот сед

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

Первая дата вставки и запятая, где это необходимо
Затем удалите все строки, начинающиеся с '|' и заканчивая '|'

0 голосов
/ 27 июня 2018

Вы можете использовать

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++)), и если значение поля соответствует шаблону <2-digits>:<2-digits>:<2-digits>.<1+digits> (/^[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]+$/, то удаляем все текст, начинающийся с . и заканчивающийся значением sub(/\..*/, "", $i);, и печать , + дата + пробел и текущее значение поля.

0 голосов
/ 27 июня 2018

Не могли бы вы попробовать awk и сообщить мне, поможет ли это вам.

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

Раствор 2-й: С чистым sed:

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