Как читать две строки в сценарии оболочки (в одной итерации line1, line2 - следующая итерация должна занять line2, line3 и т. Д.) - PullRequest
0 голосов
/ 04 августа 2020

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

var содержит:

12 abc
32 cdg
9 dfk
98 nhf
43 uyr
5 ytp

Здесь In al oop Мне нужно содержимое line1, line2 [т.е. 12 ab c \ n 32 cdg], а для следующей итерации требуется line2, line3 [32 cdg \ n 9 dfk] и так далее ..

Я пытался добиться с помощью

while IFS= read -r line
do
count=`echo ${line} | awk -F" " '{print $1}'`
id=`echo ${line} | awk -F" " '{print $2}'`
read line
next_id=`echo ${line} | awk -F" " '{print $2}'`
echo ${count}
echo ${id}
echo ${next_id}

## Here, I have some other logic of awk..
done <<< "$var"

Он читает строку 1, строку 2 на первой итерации. На второй итерации он читает строку 3, строку 4. Но мне нужно было прочитать строку 2, строку 3 на второй итерации. Может ли кто-нибудь разобраться с моими требованиями.

Заранее спасибо ..

Ответы [ 2 ]

1 голос
/ 04 августа 2020

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

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

awk 'FNR==1 {line=$0; next} {print line"\n"$0"\n"; line=$0}' lines

Пример использования / вывода

$ awk 'FNR==1 {line=$0; next} {print line"\n"$0"\n"; line=$0}' lines
12 abc
32 cdg

32 cdg
9 dfk

9 dfk
98 nhf

98 nhf
43 uyr

43 uyr
5 ytp

(дополнительная строка -break был просто включен, чтобы показать разделение, формат вывода можно изменить по желанию)

Вы можете добавить счетчик, если хотите, и вывести счет с помощью правила END.

0 голосов
/ 05 августа 2020

Решение зависит от того, что вы хотите сделать с двумя линиями. Моей первой мыслью было что-то вроде

sed '2,$ s/.*/&\n&/' <<< "${yourvar}"

Но это не очень поможет, когда вам нужно обработать две строки (я думаю, что | xargs -L2 не поможет). Если вы хотите, чтобы они были в oop, попробуйте

while IFS= read -r line; do
   if [ -n "${lastline}" ]; then
      echo "Processing lines starting with ${lastline:0:2} and ${line:0:2}"
   fi
   lastline="${line}"
done <<< "${yourvar}"
  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...