Как насчет:
while read code device state junk; do
if [[ $code == $message ]]; then
echo "Translated: $device-$state"
fi
done <CODE-LIST.txt
с использованием дополнительных процессов (то есть выпукание awk каждый раз) будет много замедлить его. Чтение
будет читать несколько полей, разделенных $ ifs
(значение по умолчанию - это белое пространство). Последняя переменная переменная получит оставшуюся часть строки, если таковая имеется.
Мне просто интересно, где придет $ Message
. За пределами кода-фрагмента возможно?
Редактировать:
Если часть кода будет происходить только один раз на входе, то вы можете разрыв
из цикла после его обнаружения; Это также будет ускорить вещи.
с 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]
}'
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
извлекает его. В конце вы должны выводить оставшиеся строки.