Консультация № 185953
03.05.2012, 11:45
111.40 руб.
0 6 1
Здравствуйте! У меня возникли сложности с таким вопросом:
необходимо написать скрипт. Вот задание:

Написать shell процедуру, которая выполняет действия:
1) Читает содержимое первого файла, передаваемое в качестве первого параметра;
2) Читает содержимое второго файла, передаваемое в качестве второго параметра;
3)Находит в первом файле строку. содержащую заданное третьим параметром слово;
4)Вставляет содержимое второго файла после найденной строки первого файла;
5)Выводит на экран содержимое полученного файла;

Заранее благодарен.

Обсуждение

Неизвестный
03.05.2012, 12:02
общий
Дубль вопроса https://rfpro.ru/question/185920 ???

Код:

#! /bin/bash
while read a ; do echo "$a" ; if echo "$a" | grep "$3" >/dev/null ; then cat "$2" ; fi ; done <"$1"

Этот вариант выводит второй файл после каждого совпадения строки с третьим аргументом.
Делать ответ?
Неизвестный
03.05.2012, 12:42
общий
Да, но нужно вставить содержимое второго файла в первый файл и вывести его. Также надо сделать проверку входных данных.
Неизвестный
03.05.2012, 13:04
общий
Тогда как-то так:
Код:
#! /bin/bash
if [ ! -f "$1" ] ; then
echo "Invalid input file 1: $1" >&2 ;
exit 1;
fi;

if [ ! -f "$2" ] ; then
echo "Invalid input file 2: $2" >&2 ;
exit 2;
fi;

if [ "x$3" == x ] ; then
echo "No search string." >&2 ;
exit 3;
fi;

while read a ; do echo "$a" ; if echo "$a" | grep "$3" >/dev/null ; then cat "$2" ; fi ; done <"$1"

Проверяйте.
Неизвестный
03.05.2012, 13:32
общий
03.05.2012, 13:42
Выводить то он выводит, но не записывает результат в 1 файл.
Неизвестный
03.05.2012, 14:26
общий
Сделал (через временный файл с создание резервной копии):
Код:
#! /bin/bash
if [ ! -f "$1" ] ; then
echo "Invalid input file 1: $1" >&2 ;
exit 1;
fi;
if [ ! -f "$2" ] ; then
echo "Invalid input file 2: $2" >&2 ;
exit 2;
fi;
if [ "x$3" == x ] ; then
echo "No search string." >&2 ;
exit 3;
fi;
rm -f "$1.tmp"
while read a ; do echo "$a" | tee "$1.tmp"; if echo "$a" | grep "$3" >/dev/null ; then cat "$2" | tee "$1.tmp" ; fi ; done <"$1"
mv "$1" "$1.old"
mv "$1.tmp" "$1"
Неизвестный
03.05.2012, 22:35
общий
это ответ
Здравствуйте, Посетитель - 393332!
Текст скрипта в приложении.

Пример файла 1 (f1.txt):
adga 1
afgagfa 2
abljklkj 3
afghsfhs 4
test 5
asfbsfgbsfg 6
agefhet 7
abfghfthr 8

Пример файла 2 (f2.txt):
zgjshs 1
zgjhsfhsf 2
zgjhdfgjsd 3
zghjdsh 4

Пример запуска скрипта:
# ./file.sh f1.txt f2.txt test
adga 1
afgagfa 2
abljklkj 3
afghsfhs 4
test 5
zgjshs 1
zgjhsfhsf 2
zgjhdfgjsd 3
zghjdsh 4
asfbsfgbsfg 6
agefhet 7
abfghfthr 8

Пример запуска с неправильным количеством параметров:
./file.sh f2.txt f2.txt
I need 3 params, your clothes and your bike!

Пример запуска скрипта, когда в первом файле нет заданного слова:
./file.sh f2.txt f2.txt test
There is no word test in the file f2.txt!

Пример запуска скрипта при отсутствии нужных файлов:
./file.sh f1 f2 test
Can't find file f1!

./file.sh f1.txt f2 test
Can't find file f2!

Будут вопросы - задавайте в мини-форуме.

Удачи!

Приложение:
#!/bin/bash
# Проверяем, что скрипту передано 3 параметра
if [ $# != 3 ]
then
# Если не три - выводим предупреждение и завершаем работу
echo "I need 3 params, your clothes and your bike!"
else
# Проверяем, что файл, переданный первым параметром, существует
if [ -f $1 ]
then
# Проверяем, что файл, переданный вторым параметром, существует
if [ -f $2 ]
then
# Ищем номер строки, на которой в первый раз появляется заданное третьим параметром слово
a=$(grep -n $3 $1|cut -f 1 -d ":"|head -1)
# Проверяем, что слово в файле есть
if [ $a > 0 ]
then
# Выводим первую часть первого файла во временный файл
head -$a $1 > /tmp/temp.tmp
# Смотрим, сколько всего строк в первом файле
c=$(cat $1|wc -l)
# Смотрим, сколько строк во второй части первого файла
d=$( expr $c - $a)
# Дописываем содержимое второго файла во временный файл
cat $2 >> /tmp/temp.tmp
# Дописываем вторую часть первого файла во временный файл
tail -$d $1 >> /tmp/temp.tmp
# Сохраняем на всякий случай исходную версию первого файла
cp $1 $1.bkp
# Перезаписываем первый файл временным файлом
cat /tmp/temp.tmp > $1
# Удаляем временный файл
rm -rf /tmp/temp.tmp
# Выводим на экран получившийся файл
cat $1
else
# Выводим предупреждение, если слова в первом файле нет
echo "There is no word $3 in the file $1!"
fi
else
# Выводим предупреждение, если не найден второй файл
echo "Can't find file $2!"
fi
else
# Выводим предупреждение, если не найден первый файл
echo "Can't find file $1!"
fi
fi
Форма ответа