Обработка разделов текстового потока, разделенных символом ␁

не столь элегантное решение:

преобразовать %m%y в 100*y+m, например: 0416->1604, затем сравнить по числовому значению.

for i in Z*
do
  # convert %m%y to 100*y+m
  current=$((100 * $(echo "$i"|cut -c 7-8) + $(echo "$i"|cut -c 5-6)))
  if [[ $current > $max ]]; then
    max=$current
    maxstr=$i
  fi
done

echo $maxstr
1
03.06.2018, 10:39
2 ответа

Puede dividir las secciones en archivos separados y procesarlos uno -por -uno. Esto produciría outfile.1etc.:

awk '/^␁/ { count++ } { print > "outfile." count }  ' < file

O bien, podría tener awkcanalizar las secciones una -por -una a un comando:

awk  'BEGIN {command = "./script.sh"} /^␁/ { close(command) }
      { print | command } ' < file

Utilicé el SÍMBOLO literal U+2401 PARA EL INICIO DEL TÍTULO en lo anterior, ya que eso es lo que me dio el copiado -del pegado. Usaste \01en la línea de comando xargs, así que si eso es lo que tienes, cambia el garabato SOH al INICIO DEL TÍTULO real, \001en el código awktambién.


También podríamos establecer RSen el SOH, pero eso no encaja exactamente, ya que aquí tenemos el SOH al comienzo del registro, y awkespera encontrar el separador de registro al final.

2
28.04.2021, 23:46

Если в исходном файле нет пустых строк (двух последовательных новых строк ), вы можете преобразовать каждую из в две новые строки с помощью sed. Это создаст файл (или поток ), который имеет пустую строку в качестве разделителя каждой записи. Затем awk (с пустым RS )способен разделить каждую "пустую строку" файлового (потока )с разделителями на "записи".

Описание может показаться сложным, но посмотрите на код:

sed 's/␁/\n\n/g' file | awk -v RS='' -vf="./script" '{print|f;close(f)}'

Если вам действительно нужно преобразовать символ со значением байта 0x01, замените на \x01в команде sed.

1
28.04.2021, 23:46

Теги

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