Замените определенные строки на значение из предыдущей строки

У меня есть следующий текст:

Source IP,URL 1.1.1.1,example1.com Blank,example2.com 2.2.2.2,example3.com Blank,example4.com Blank,example5.com Blank,example6.com Blank,example7.com 7.7.7.7,example8.com Blank,example9.com Blank,example10.com 

Как я могу заменить «Пустое» на непустое значение над ним и получить следующий результат?

 Source IP,URL 1.1.1.1,example1.com 1.1.1.1,example2.com 2.2.2.2,example3.com 2.2.2.2,example4.com 2.2.2.2,example5.com 2.2.2.2,example6.com 2.2.2.2,example7.com 7.7.7.7,example8.com 7.7.7.7,example9.com 7.7.7.7,example10.com 

3 Solutions collect form web for “Замените определенные строки на значение из предыдущей строки”

Вот решение Perl:

 perl -pe ' $prev=$1 if /^([\d\.]+)/; s/Blank/$prev/' file.txt 

Объяснение:

  • Флаг -p Perl означает «Пройдите через входной файл по строкам и распечатайте каждую строку», -e означает «запустить сценарий, указанный в командной строке».

  • $prev=$1 if /^([\d\.]+)/; : Если строка начинается с ( ^ ) строки чисел ( \d ) и точек \. , сохраните эту строку (IP) как $prev . Итак, когда скрипт читает файл, $prev будет содержать последний найденный IP-адрес.

  • s/Blank/$prev/ : замените строку Blank значением $prev .

 awk -F, '{if ($1 == "Blank") ip=repltext; else {ip=$1; repltext=$1;}; print ip "," $2}' inputfile 

предполагая, что «Source IP, URL» не является частью ввода. Если это изменение

 awk -F, 'NR == 1 {next;}; {if ($1 == "Blank") ... 

Также предполагается, что первая строка данных не содержит «Пусто», а всегда IP-адрес.

Вот идиоматическое решение awk:

 <infile awk '$1 == "Blank" { $1 = p } { p = $1 } 1' FS=, OFS=, 

Вывод:

 Source IP,URL 1.1.1.1,example1.com 1.1.1.1,example2.com 2.2.2.2,example3.com 2.2.2.2,example4.com 2.2.2.2,example5.com 2.2.2.2,example6.com 2.2.2.2,example7.com 7.7.7.7,example8.com 7.7.7.7,example9.com 7.7.7.7,example10.com 
  • Grep с диапазоном и пропускает три фильтра
  • Как заменить все первые вхождения в совпадающие строки с инкрементным числом?
  • Шаблон совпадения, выполнить расчет и распечатать только 3 или 4 значения плавающего значения max
  • Удалить строку, содержащую первое появление «pattern1» после последнего появления «pattern2»?
  • Суммируйте значения с запятой в разных столбцах
  • Как найти все файлы, содержащие различные строки из длинного списка комбинаций строк?
  • Как использовать awk для печати, если значение столбца имеет четное число
  • Смутно о команде: sed '/ ^ # / d' ~ / .profile
  • Как фильтровать вывод сценария в bash, используя запрос типа «(я ИЛИ вы) ИЛИ (john AND! Doe)»?
  • Замена строк с помощью словаря
  • Сортировка .dat файлов по внутренним данным
  • Linux и Unix - лучшая ОС в мире.