Читать файл построчно -> искать каждую строку в другом текстовом документе, если совпадение, выводить в другой текстовый файл - PullRequest
1 голос
/ 12 марта 2011

У меня есть скрипт, который принимает два параметра.

ls $1 > $1.txt
ls $2 > $2.txt  

Теперь у меня есть a.txt ($ 1 - это каталог 'a', $ 2 - это каталог 'b') и b.txt каждый со своим содержимым, перечисленным внутри них.То, что я хочу сделать, это поиск построчно в a.txt и посмотреть, есть ли совпадение в b.txt.

Если у меня есть эти файлы в формате .txt:

file1 -> search for file1 in b.txt, if match, output to a_match.txt
file2 -> search for file2 in b.txt, if match, output to a_match.txt
file3 -> search for file3 in b.txt, if match, output to a_match.txt  

И наоборот для b.txt.Как бы я это сделал?Кроме того, не ища альтернативных способов сделать это, есть очень много других способов проверить различия между каталогами, но это единственный приемлемый способ для моего назначения: (

Ответы [ 4 ]

2 голосов
/ 12 марта 2011

Вот быстрое решение, которое, я думаю, отвечает вашим требованиям:

fgrep -x -f b.txt a.txt > a_match.txt
0 голосов
/ 12 марта 2011

Это может помочь вам просто пройти учебник, и он лучше всего соответствует вашим требованиям. Опять же, не существует только одного способа читать файл построчно, и некоторые быстрее, чем другие, а некоторые более интуитивно понятны, чем другие.

http://www.unix.com/tips-tutorials/18009-12-ways-parse-file.html

0 голосов
/ 12 марта 2011

Хорошо, это явно домашнее задание, поэтому я не собираюсь давать вам полное решение. Вот схема

while "there are lines left in the file, read a line" do
     grep "the line" "the file"
done

ключ для получения строк - команда read. Сделайте help read в bash для деталей.

Обновление

Хорошо, давайте посмотрим немного повнимательнее. Запустите скрипт с

Давайте назовем скрипт a.bash. Вы хотите запустить его как

 $ a.bash b.txt < a.txt > a_match.txt  

a.bash - это скрипт, который читает строку из a.txt, выполняет поиск в b.txt и отправляет вывод в STDOUT, который затем направляется в ваш файл a_match.txt.

Запустите скрипт с "строкой Шебанга". Обычно это

 #!/usr/bin/bash --

или что-то подобное.

Примитив read просто считывает строку в переменную и по умолчанию считывает переменную с именем REPLY. Так что "в файле осталось строк, прочитайте строку" просто

 while read

Имя файла для поиска будет в специальной переменной оболочки $ 1, представляющей первый аргумент. Поскольку другие имена используются в перенаправлении, они вообще не появляются в качестве аргументов.

Теперь команда grep (1) ищет в файле строку и помещает строку, в которой эта строка встречается, в STDOUT. Так что все, что нам нужно для поиска, это

 grep $REPLY b.txt

(прочитайте справочную страницу для grep .)

Поскольку grep (1) в любом случае выводит вывод в STDOUT, он отключится и будет перенаправлен в a_matches.txt. Это ваша строка "grep the line in the file".

Теперь просто соберите все это вместе.

Тест:

  1. Почему это $REPLY?
  2. Как бы вы изменили скрипт, чтобы вы могли назвать его так:

    $ a.bash a.txt b.txt a_matches.txt

0 голосов
/ 12 марта 2011

Вот что я бы использовал:

diff dir1/ dir2/

или

diff "$1" "$2"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...