Используя sed, добавьте строку X строк выше соответствия

Как насчет:

while read code device state junk; do
    if [[ $code == $message ]]; then
        echo "Translated: $device-$state"
    fi
done <CODE-LIST.txt

с использованием дополнительных процессов (то есть выпукание awk каждый раз) будет много замедлить его. Чтение будет читать несколько полей, разделенных $ ifs (значение по умолчанию - это белое пространство). Последняя переменная переменная получит оставшуюся часть строки, если таковая имеется.

Мне просто интересно, где придет $ Message . За пределами кода-фрагмента возможно?

Редактировать: Если часть кода будет происходить только один раз на входе, то вы можете разрыв из цикла после его обнаружения; Это также будет ускорить вещи.

0
05.05.2015, 19:28
2 ответа

с AWK (установлено по умолчанию на POSIX Systems, включая Ubuntu):

POSIXLY_CORRECT=1 awk -v X=2 '
  NR >= 2 && /^output-[0-9]{3}\.ts$/ && ++n % X == 1 {
    print "#Inserted line", i++
  }
  NR>1 {print last}
  {last = $0}
  END{if (NR) print last}' < file.in > file.out

это для 2 строк выше. Чтобы обобщить на N линий выше:

POSIXLY_CORRECT=1 awk -v N=2 -v X=2 '
  BEGIN{N--}
  NR > N {
    if (/^output-[0-9]{3}\.ts$/ && ++n % X == 1)
      print "#Inserted line", i++
    print l[NR % N]
  }
  {l[NR % N] = $0}
  END{
    for (i = NR > N ? NR - N + 1 : 1; i <= NR; i++) print l[i % N]
  }'
2
28.01.2020, 02:20

Perl в Rescue:

< .m3u8  perl -ne 'push @w, $_;
                   unshift @w, "#Inserted line " . (0 + $c++) . "\n"
                       if /^output-[0-9]+\.ts/ && 0 == $m++ % 2;
                   print shift @w while @w > 1;
                   }{ print @w;'

@W - это массив «скользящего окна», который сохраняет последние 2 строки. $ m содержит количество совпадений, то есть количество линий «Вывод XXXX», столкнувшихся до сих пор, поэтому если модуль 2 он дает 0, вы забираете каждый 2-й матч. Без смещения вставляет строку в массив окна в начале, Shift извлекает его. В конце вы должны выводить оставшиеся строки.

2
28.01.2020, 02:20

Теги

Похожие вопросы