Может ли кто-нибудь помочь мне реализовать один из сценариев средней сложности с использованием команд sed или awk?

В целом, foo < barи < bar fooэквивалентны в сценариях bash. Каждый раз, когда < filenameобрабатывается оболочкой, это означает, что команда, с которой он связан, будет получать стандартный ввод из этого файла. Никаких дополнительных команд или процессов здесь не задействовано; оболочка делает это сама.

Запуск cat filenameсчитывает содержимое указанного файла и записывает его в стандартный вывод. |между двумя командами означает подключение стандартного вывода левой команды к стандартному вводу правой команды.

Таким образом, обе ваши команды имеют одинаковый эффект отправки содержимого /proc/uptimeв awk, но первый способ запускает для этого дополнительный catпроцесс.

1
04.06.2021, 15:16
2 ответа

Ваш пример и/или попытка неверны.

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

while read -r line;  do
  sed -n "/CREATE TABLE <SCHEMA_NAME>.$line/,/;/p" CREATE_DDLs.txt ;
done < List_File.txt

и он будет соответствовать всем записям, потому что ACASEтакже будет соответствовать ACASE01. Используйте $в качестве привязки для окончания строки :

.
while read -r line;  do
  sed -n "/CREATE TABLE <SCHEMA_NAME>.$line$/,/;/p" CREATE_DDLs.txt ;
done < List_File.txt

Тем не менее, для более длинного списка таблиц не очень эффективно сканировать весь файл снова и снова, в то время как с помощью расширенных регулярных выражений вы можете искать что-то вроде (ACASE|ABC|ABCH), так что поместите этот первый файл в правильную форму и использовать его в шаблоне поиска:

TABLES=$(cat List_File.txt|tr '\n' '|')
sed -nE "/CREATE TABLE <SCHEMA_NAME>.(${TABLES%|})$/,/;/p" CREATE_DDLs.txt

trзаменит все новые строки чертами ИЛИ, а %|в расширении переменной удалит завершающую черту.

1
28.07.2021, 11:27

Вы можете сделать что-то подобное, используя *режим абзаца" в GNU awk:

gawk '
    NR==FNR{tbl["CREATE TABLE <SCHEMA_NAME>." $1]; next} ($1 in tbl){ORS=RT; print}
  ' List_File.txt RS= FS='\n' CREATE_DDLS.txt
CREATE TABLE <SCHEMA_NAME>.ACASE
(
    COLUMN1,
    COLUMN2,
    COLUMN3
) ;

CREATE TABLE <SCHEMA_NAME>.ABC
(
    COLUMN1,
    COLUMN2,
    COLUMN3
) ;

Вы можете сделать то же самое в любом awk, за исключением того, что у вас не будет доступа к RT, поэтому вам нужно будет установить ORSна что-то фиксированное, например\n\n

0
28.07.2021, 11:27

Теги

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