сравнить список файлов с несколькими одинаковыми файлами и создать соответствующие записи в одном файле - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть список продуктов в файле search.txt, и мне нужно найти список записей продуктов, доступных в нескольких похожих файлах файлов r, и сгенерировать один объединенный файл с соответствующими продуктами, используя unix.

search.txt:

B0003
A0024
B1545

product1.txt

00|01|20200403|123400
45|1|A0001|one
45|2|A0001|C001|001|003
45|2|B0003|C896|001|004
45|2|A0024|C234|001|004
45|1|B1542|two
45|2|B1542|C231|001|004
45|2|B1545|C237|001|004
90|0000001|

product2.txt

00|01|20200403|123400
45|1|A0002|one
45|2|A0002|C001|001|003
45|2|B0003|C896|001|004
45|2|A0024|C234|001|004
45|1|B1542|two
45|2|B1542|C231|001|004
45|2|B1545|C237|001|004
45|1|B777|two
45|2|B777|C231|001|004
45|2|B777|C237|001|004
90|0000001|

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Похоже, у вас есть несколько разных форматов для записей в одном файле, и у вас нет ожидаемых результатов, так что это лучшее предположение относительно того, что вы хотите, используя join и sort:

$ join -11 -23 -t'|' -o 2.1,2.2,2.3,2.4,2.5,2.6 <(sort search.txt) <(sort -t'|' -k3,3 product*.txt)
45|2|A0024|C234|001|004
45|2|A0024|C234|001|004
45|2|B0003|C896|001|004
45|2|B0003|C896|001|004
45|2|B1545|C237|001|004
45|2|B1545|C237|001|004

В другом возможном подходе используется grep:

$ grep -Fhf <(sed 's/.*/|&|/' search.txt) product*.txt
45|2|B0003|C896|001|004
45|2|A0024|C234|001|004
45|2|B1545|C237|001|004
45|2|B0003|C896|001|004
45|2|A0024|C234|001|004
45|2|B1545|C237|001|004

Для обоих этих типов требуется оболочка типа bash или zsh, которая понимает синтаксис перенаправления <(command).

Если вы делаете много вещей с этими файлами, подумайте об их импорте в базу данных (sqlite3 проще всего). Запросы с соответствующими индексами будут выполняться намного быстрее, чем сканирование текстовых файлов.

0 голосов
/ 05 апреля 2020

Создание консолидированного файла со всеми продуктами в одном файле

cat product*.txt > consolidated_product.txt
   while read line;
   do
   array=`echo ${line} | sed 's/\s/\n/g'`;
   for i in ${array};
   do
   echo "$i"; #replace this echo with grep  
   #grep $i consolidated_product.txt
   done;
   done <search.txt

Этот вывод можно перенаправить в другой файл.

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