Как извлечь несколько параметров из строки, используя sed или awk - PullRequest
1 голос
/ 08 сентября 2011

У меня есть файл журнала, который выглядит так:

2010/01/12/ 12:00 some un related alapha 129495 and the interesting value 45pts
2010/01/12/ 15:00 some un related alapha 129495 and no interesting value
2010/01/13/ 09:00 some un related alapha 345678 and the interesting value 60pts

Я бы хотел построить строку даты и времени с интересным значением, используя gnuplot Чтобы сделать это, я пытаюсь проанализировать указанный выше файл журнала в файл CSV, который выглядит так (не все строки в журнале имеют графическое представление):

2010/01/12 / 12:00, 45

2010/01/13 / 14:00, 60

Как я могу сделать это с помощью sed или awk?

Я могу извлечь начальные символы что-то вроде:

cat partial.log | sed -e 's/^\(.\{17\}\).*/\1/' 

но как мне извлечь конечные значения?

Я пытался сделать это безрезультатно!

Спасибо

Ответы [ 6 ]

1 голос
/ 09 сентября 2011

Bash

#!/bin/bash

while read -r a b line
do
  [[ $line =~ ([0-9]+)pts$ ]] && echo "$a $b, ${BASH_REMATCH[1]}"
done < file
1 голос
/ 09 сентября 2011

try:

awk 'NF==12{sub(/pts/,"",$12);printf "%s %s, %s ", $1, $2, $12}' file

Ввод:

2010/01/12/ 12:00 some un related alapha 129495 and the interesting value 45pts
2010/01/12/ 15:00 some un related alapha 129495 and no interesting value
2010/01/13/ 09:00 some un related alapha 345678 and the interesting value 60pts

Выход:

2010/01/12/ 12:00, 45 2010/01/13/ 09:00, 60

Обновлено для новых требований:

Команда:

awk 'NF==12{gsub(/\//,"-",$1)sub(/pts/,"",$12);printf "%s%s %s \n", $1, $2, $12}' file 

Вывод:

2010-01-12-12:00 45 
2010-01-13-09:00 60

HTH Крис

0 голосов
/ 09 сентября 2011

Я бы сделал это в два этапа конвейера, сначала awk, а затем sed:

awk '$NF ~ /[[:digit:]]+pts/ { print $1, $2", "$NF }' | 
  sed 's/pts$//'

Используя $NF вместо фиксированного числа, вы работаете с последним полем, независимо от того, как выглядит несвязанный текст и сколько он занимает полей.

0 голосов
/ 09 сентября 2011

sed можно сделать более читабельным:

nn='[0-9]+'
n6='[0-9]{6}'
n4='[0-9]{4}'
n2='[0-9]{2}'
rx="^($n4/$n2/$n2/ $n2:$n2) .+ $n6 .+ ($nn)pts$"

sed -nre "s|$rx|\1 \2|p" file 

вывод

2010/01/12/ 12:00 45
2010/01/13/ 09:00 60
0 голосов
/ 09 сентября 2011
awk '/pts/{ gsub(/pts/,"",$12);print $1,$2", "$12}' yourFile

вывод:

2010/01/12/ 12:00, 45
2010/01/13/ 09:00, 60

[ Обновление : на основе вашего нового требования]

Как я могу изменить вышеприведенный вид:

2010-01-12-12:00 45 
2010-01-13-09:00 60
awk '/pts/{ gsub(/pts/,"",$12);a=$1$2OFS$12;gsub(/\//,"-",a);print a}' yourFile

вышеприведенный cmd даст вам:

2010-01-12-12:00 45
2010-01-13-09:00 60
0 голосов
/ 08 сентября 2011

Это действительно возможно.Например, это регулярное выражение:

sed -n 's!([0-9]{4}/[0-9]{2}/[0-9]{2}/ [0-9]{2}:[0-9]{2}).*([0-9]+)pts!\1, \2!p' 
...