Вставка совпавшей строки из предыдущей строки в текущую строку с помощью sed или awk - PullRequest
0 голосов
/ 08 августа 2011

У меня есть CSV-файл, который показывает статистику для ссылок за полчаса. Имя ссылки отображается только в строке 00:00.

link1,0:00,0,0,0,0
,00:30,0,0,0,0
,01:00,0,0,0,0
,01:30,0,0,0,0
,02:00,0,0,0,0
,02:30,0,0,0,0
,03:00,0,0,0,0
,03:30,0,0,0,0
,23:30,0,0,0,0
....
....
link2,00:00,0,0,0,0

Как скопировать имя ссылки на каждую другую строку, пока имя ссылки не будет другим, с помощью sed или awk?

Ответы [ 3 ]

1 голос
/ 08 августа 2011

Это более простая работа с awk, но если вы хотите использовать sed:

sed -e '/^[^,]/{h;s/,.*//;x};/^,/{G;s/^\(.*\)\n\(.*\)/\2\1/}'

Добавьте закомментированную версию в формате файла сценария sed, который можно запустить с sed -f script:

# For lines not beginning with a ',', saves what precedes a ',' in the hold space and print the original line.
/^[^,]/{
h
s/,.*//
x}
# For lines beginning with a ',', put what has been save in the hold space at the beginning of the pattern space and print.
/^,/{
G
s/^\(.*\)\n\(.*\)/\2\1/}
1 голос
/ 08 августа 2011

Вы можете сделать это в чистой оболочке bash без необходимости запуска нового процесса, который должен быть быстрее, чем использование awk или sed:

IFS=","
while read v1 v2; do
  if [[ $v1 != "" ]]; then
    link=$v1;
  fi
  printf "%s,%s\n" "$link" "$v2"
done < file
1 голос
/ 08 августа 2011

С awk, просто отслеживайте последнее увиденное непустое имя ссылки и всегда используйте его.

awk -F, -v OFS=, '$1 != "" { link=$1 } { $1 = link; print $0 }'

Опуская эллипсы, это дает:

link1,0:00,0,0,0,0
link1,00:30,0,0,0,0
link1,01:00,0,0,0,0
link1,01:30,0,0,0,0
link1,02:00,0,0,0,0
link1,02:30,0,0,0,0
link1,03:00,0,0,0,0
link1,03:30,0,0,0,0
link1,23:30,0,0,0,0
link2,00:00,0,0,0,0
...