Как использовать Awk для обратного отсчета совпадения с соответствующей строкой выше? - PullRequest
0 голосов
/ 17 октября 2019

Я пишу сценарий оболочки для удаления записей из файла конфигурации, и в какой-то момент необходимо будет подсчитать разницу между совпадающей строкой и строкой несколькими строками выше (может не всегда иметь одинаковое расстояние).

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

IЯ работаю с файлом конфигурации, который выглядит аналогично показанному ниже. Каждая запись представляет собой ссылку в цепочке, которая вызывает следующую запись (поэтому существуют параметры с именами NextOKItem и NextKOItem, для которых установлено значение A_#, что соответствует записи под ней. Таким образом, NextOKItem = A_2 сообщает приложению, что в случае успеха, перейдите к записи [Acquisition_2].

Сценарий, который удаляет записи, должен заменить значения после удаления записей, поэтому я сначала идентифицирую, какое Приобретение необходимо удалить через имя QueueName (этоединственный параметр для скрипта) с помощью awk и count до тех пор, пока я не найду ";", выполнив что-то вроде этого:

sFromQLocationLineNumber=`cat $sSacqDspFile | grep -n $sQueue | head -n1`
# $sFromQ is a parameter passed when the script is called, with the name of the queue.
#I pipe into head -n1 because there may be multiple entries in the format sQueue_filetype, sQueue_process, etc.
nAwkPosition=`expr $nFromQLocationLineNumber - 4`
nFromQnumberOfLines=(`cat $sSacqDspFile | awk "NR==$nAwkPosition,/;/" | wc -l`)

Подсчитав из расположения имя очереди и вычтя 4 строки, я могу определитьрасположение заголовка (тот, который говорит [Acquisition_#]).

Вместо сохранения этого жестко запрограммированного 4, я хочу иметь возможность использовать инструмент командной строки, такой как awk, для подсчета из «QueueName»"и укажите, сколько строк выше - это строка [Acquisition_#].

Что-то вроде awk "NR==$nAwkPosition,/{Acquisition above}/" | wc -l.

Если я просто сделаю awk "NR==$nAwkPosition,/Acquisition/" | wc -l, он вернет числострок от строки с именем очереди до строки с Приобретением ниже, которая в приведенном выше примере будет 18.

Возможен ли этот обратный счет?


Я работаю сфайл конфигурации, похожий на приведенный ниже.

[Acquisition_1]
QueueManager = SOMEMANAGER
UserId = hashedid
ConnPsw = hashedpw
QueueName = FROM.virtualname
Method = I
Mode = C
FilePath = /somepath/virtualname
UseOriginalName = Y
UseDestFileName = N
PostProc = /custompath/script.sh
ProcParm = parameters ?PATH_FNAME?
ProcSusp = 1
NextOKItem = A_2
NextKOItem = A_2
WaitNextOKItem = 1
WaitNextKOItem = 1
IntervalNumber = 0
;
[Acquisition_2]
QueueManager = SOMEMANAGER
UserId = hashedid
ConnPsw = hashedpw
QueueName = FROM.pathname
Method = I
Mode = C
FilePath = /somepath/pathname
UseOriginalName = Y
UseDestFileName = N
PostProc = /custompath/script.sh
ProcParm = parameters ?PATH_FNAME?
ProcSusp = 1
NextOKItem = A_3
NextKOItem = A_3
WaitNextOKItem = 1
WaitNextKOItem = 1
IntervalNumber = 0
;
[Acquisition_3]
QueueManager = SOMEMANAGER
UserId = hashedid
ConnPsw = hashedpw
QueueName = FROM.targetname
Method = I
Mode = C
FilePath = /somepath/targetname
UseOriginalName = Y
UseDestFileName = N
PostProc = /custompath/script.sh
ProcParm = parameters ?PATH_FNAME?
ProcSusp = 1
NextOKItem = A_4
NextKOItem = A_4
WaitNextOKItem = 1
WaitNextKOItem = 1
IntervalNumber = 0
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...