LINUX.ORG.RU
ФорумAdmin

awk — вывод заданного поля СТРОГО из строки следующей за найденой строкой

 ,


1

1

Есть вот такое:

sudo gpt show disk4
Password:
start       size  index  contents
          0          1         PMBR
          1          1         Pri GPT header
          2         32         Pri GPT table
         34          6         
         40     409600      1  GPT part - "EFI System Partition"
     409640  976101344      2  GPT part - ""
  976510984     262151         
  976773135         32         Sec GPT table
  976773167          1         Sec GPT header      
Надо:

Найти строку, где ТРЕТЬЕ поле == 2, затем сложить значение из ВТОРОГО поля этой строки с значение из ВТОРОГО поля СЛЕДУЮЩЕЙ строки, сумму целочисленно разделить на 8, затем умножить на 8, результат напечатать.

Найти строку просто:

sudo gpt show disk0 | awk '$3 == 2 {print $2}'
А вот как в ТОМ ЖЕ проходе пулучить значение нужного поля СЛЕДУЮЩЕЙ строки — ума не приложу...

По идее нужно значение NR найденной строки сохранить и использовать для вывода нужного поля строки с увеличенным на еденицу NR.

Но вот реализовать это за ОДИН проход у меня не получается, хотя уверен что есть простое решение.

С awk дел практически не имел, так что не судите строго.

Помогите пожалуйста!

P.S.

Нужно это что бы автоматизировать вот такой однострочный скриптик:

sudo /usr/bin/true; diskutil unmountDisk force disk4 && (sudo gpt remove -i 2 disk4 && diskutil unmountDisk force disk4 && sudo gpt add -b 409640 -i 2 -s 976363488 -t "48465300-0000-11AA-AA11-00306543ECAC" disk4 && sudo fsck_hfs -fy /dev/disk4s2 && diskutil mount /dev/disk4s2) && (echo; echo "O'K"; echo; diskutil renameVolume /dev/disk4s2 "PhotoArchive") || echo; echo "Wrong..."

man awk /getline

vel ★★★★★
()
Ответ на: комментарий от user_undefined

user_undefined, что-то не работает:

sudo gpt show disk0 | awk '$3 == 2 {idx=$3; getline; printf "%d %d", idx, $3}'
2 3

Но:

sudo gpt show disk0 | awk '$3 == 2 {print $2}'
351562496

Cave-Canem
() автор топика
Ответ на: user_undefined, что-то не работает: от Cave-Canem

user_undefined:

awk '$3 == 2 {a = $2; getline; b = $2; print int (((a + b) / 8 )) * 8 }' "/private/var/spool/cups-pdf/ES/zxcvb.txt"
976363488

Вроде работает, спасибо за наводку!

Cave-Canem
() автор топика

Для твоего ввода сгодиться и выше написанное, можно ещё так:

awk 'BEGIN {state=0}; state == 1 {printf "%d %d\n", idx, $2; state = 0}; $3 == 2 {idx=$2; state = 1}'

uCore
()

Но вот реализовать это за ОДИН проход у меня не получается, хотя уверен что есть простое решение.

Вы сами или изобрели, или не поняли ТЗ и маетесь изобретением машины времени. Невозможно получить данные, которых еще не было, все эти getline предназначены для считывания либо из другого файла либо для скипанья строки. А получить следующую строку в awk это просто продолжить awk программу, а не проход.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)

Найти строку, где ТРЕТЬЕ поле == 2, затем сложить значение из ВТОРОГО поля этой строки с значение из ВТОРОГО поля СЛЕДУЮЩЕЙ строки, сумму целочисленно разделить на 8, затем умножить на 8, результат напечатать.

Вполне себе описание конечного автомата. Программы на awk помимо входного потока с полями могут иметь свое собственное глобальное состояние. Дальше объяснять надо?)

yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.