2014-11-18 3 views
1

файла .csv, который имеет такие строки:AWK для транспонирования строк текстового файла

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 
+0

Почему у вас есть знак равенства ('=') в RE вы пытаетесь заменить? Имеет ли ваш входной файл знак равенства? Если да, пожалуйста, обновите свой размещенный образец ввода, чтобы показать это. –

ответ

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): порезы второй firls ($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 -digit и сохранить его как \1
  • [0-9]\{2\}...: после космического матча 3 раза в 2-значный шаблон и сохранить их в \2, \3 и \4
  • [0-9]\{3\}: и в последнем матче 3-значного шаблон и сохранить его как \5
  • \1 \2:\3:\4.\5: формат вывода
+0

Одна незначительная коррекция. В awk-решении это должно быть ($ 2, 0,2) – Ivan

+0

@Ivan должно быть '($ 2,1,2)' Я его отредактировал, спасибо ... – chaos

0

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

$ 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

Спасибо. Я узнал из вашего комментария и кода. – Ivan

Смежные вопросы