Файл .csv, в котором есть такие строки:

20111205 010016287,1.236220,1.236440

Это должно читаться так:

20111205 01:00:16.287,1.236220,1.236440

Как мне это сделать в awk? Экспериментируя, я дошел до этого. Думаю, мне нужно сделать это за два прохода. Один подпрограмм для чтения поля даты и времени, а следующий для его изменения.

awk -F, '{print;x=$1;sub(/.*=/,"",$1);}' data.csv
awk
1
Ivan 18 Ноя 2014 в 22:46

2 ответа

Лучший ответ

Используйте эту команду awk:

echo "20111205 010016287,1.236220,1.236440" | \
awk -F[\ \,] '{printf "%s %s:%s:%s.%s,%s,%s\n", \
$1,substr($2,1,2),substr($2,3,2),substr($2,5,2),substr($2,7,3),$3,$4}'

Объяснение:

  • -F[\ \,]: устанавливает в качестве разделителя пробел и ,
  • printf "%s %s:%s:%s.%s,%s,%s\n": форматировать вывод
  • substr($2,0,3): разрезает вторую веточку ($2) на нужные части

Или используйте эту команду sed:

echo "20111205 010016287,1.236220,1.236440" | \
sed 's/\([0-9]\{8\}\) \([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{3\}\)/\1 \2:\3:\4.\5/g'

Объяснение:

  • [0-9]\{8\}: сначала сопоставьте 8-значный шаблон и сохраните его как \1
  • [0-9]\{2\}...: после пробела совпадение 3 раза с двухзначным шаблоном и сохранение их в \2, \3 и \4
  • [0-9]\{3\}: и, наконец, сопоставьте трехзначный шаблон и сохраните его как \5
  • \1 \2:\3:\4.\5: форматировать вывод
2
chaos 19 Ноя 2014 в 06:42

Sed лучше подходит для этой работы, поскольку это простая замена в отдельных строках:

$ sed -r 's/( ..)(..)(..)/\1:\2:\3./' file
20111205 01:00:16.287,1.236220,1.236440

Но если вы предпочитаете здесь GNU awk с gensub ():

$ awk '{print gensub(/( ..)(..)(..)/,"\\1:\\2:\\3.","")}' file
20111205 01:00:16.287,1.236220,1.236440
0
Ed Morton 18 Ноя 2014 в 22:04