#sh
#sh
Вопрос:
Я хотел создать программу, которая выполняет поиск по всем строкам, содержащим все указанные факторы, из файла ‘mydata’. Я попытался извлечь первый фактор из mydata и сохранить его в переменной ‘a’. Затем я попытался извлечь следующий фактор из a и снова сохранить результат в a, пока не извлеку все факторы. Когда это будет сделано, у меня должен быть результат в a, поэтому я ввел команду в awk, чтобы распечатать его в нужном мне формате (display.awk).
if [ $# -eq 0 ]
then
echo -e "Usage: phoneA searchfor [...searchfor]n(You didn't tell me what you want to search for.)"
else
a=""
for i in $*
do
if [ -z "$a" ]
then
a=$(egrep "$i" mydata)
else
a=$(printf '$s' "$a" | egrep "$i")
fi
done
awk -f display.awk "$a"
fi
// until here is the main code
BEGIN{FS="|"}
{print "--------------->";}
{print "name : "$1;}
{print "address : "$2;}
{print "phone : "$3;}
{print "<---------------";}
// this is display.awk
/*
The data in 'mydata' is in the format of
Name | Address | PhoneNumber
*/
Если я укажу факторы, имя и адрес, он должен напечатать
—————>,
name : Имя,
адрес: Адрес,
телефон: номер телефона,
<————— по одному в каждой строке.
Ответ №1:
В программе есть две простые ошибки, которые вызывают вашу проблему.
- параметры форматирования printf начинаются с
%
, а не$
:
a=$(printf '$s' "$a" | egrep "$i")
должно быть:
a=$(printf '%s' "$a" | egrep "$i")
$a
это переменная, а не файл, поэтому передайте ее в awk с помощью printf, так же, как вы сделали для egrep:
awk -f display.awk "$a"
может стать:
printf '%s' "$a" | awk -f display.awk
Существует потенциальная проблема с выводом: вы получите начальные и конечные пробелы, потому что разделитель полей на самом деле является ПРОБЕЛОМ по ВЕРТИКАЛЬНОЙ ЧЕРТЕ, а не просто ВЕРТИКАЛЬНОЙ ЧЕРТОЙ.
Комментарии:
1. Большое вам спасибо! Это был мой первый раз, когда я кодировал с помощью shell, поэтому я допустил много ошибок. Но благодаря вам я смог закончить свою домашнюю работу!