3

Я хотел бы, чтобы из командной строки можно было искать имя и произносить букву A, B, C, D, E, F, под которым оно появляется, и имя, а не что-то промежуточное. Так что, если я ищу Тим, он должен сказать:

B  
tim

Вот файл:

A
bob

john

B
tom

tim

C
phil 
bob

D
gary
tony

E
anne
rachel

F
gareth

2 ответа2

1

Ладно, как насчет чего-то вроде этого:

awk "/^[A-Z]\$/{ l=\$1 ; } ; /^${NAME}\$/ { print l ; exit ; };"

Минусы: включает в себя цитирование (которое я лично стараюсь избегать) и регулярные выражения (которые трудно понять) и awk (что трудно понять)

Плюсы: я думаю, что это помогает, по крайней мере, насколько я понимаю это пересмотрено.

(само собой разумеется, что вы должны заменить $ {NAME} на запись, которую вы ищете, например, tim)


Объяснение, которое было запрошено в разделе комментариев:

/^[A-Z]\$/{ l=\$1 ; }

Для каждой строки, которая является одной заглавной буквой, присвойте первый (единственный) элемент в этой строке переменной l (буква ell).

/^${NAME}\$/ { print l ; exit ; }

Для каждой строки, которая соответствует $ {NAME} (вы должны заменить то, что ищете $ {NAME}, как я уже говорил выше, или установить и экспортировать переменную среды NAME перед запуском команды), выведите самое последнее значение для переменной l, а затем выйдите. По сути, программа завершает работу, как только встречает строку, которая точно соответствует указанному значению, сразу после печати последней обнаруженной строки, соответствующей первому регулярному выражению.

Я процитировал все $, кроме того, который использовался для $ {NAME}, потому что я использовал двойные кавычки вместо одинарных кавычек (чтобы позволить $ {NAME} расширяться, но во избежание путаницы с другими $.

0
grep -B1 <searchstring> <filename>

Например

grep -B1 tim file

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .