Как найти файл для каждой записи в списке и распечатать новый файл для каждой записи

Я добавил следующую строку в ~ / .profile Она устанавливает переменную DBUS_SESSION_BUS_ADDRESS. Это решило проблему для меня.

eval `dbus-launch --sh-syntax`
1
21.02.2017, 01:42
3 ответа

Вы можете сделать это таким образом, создав команды "на лету":

grep -f list_file data_file | sed -e "s/^\([^ ]*\).*/echo '&' >> \1;/" | sh
0
27.01.2020, 23:46

Вы можете создать справочную таблицу (или хэш) из list_file , например, используя ассоциативный массив в awk :

awk 'NR==FNR {list[$1]=1; next} $1 in list {print > $1".txt"}' list_file data_file

Результаты будут помещены в файлы 100_fullA.txt , 100_fullB.txt и так далее.

1
27.01.2020, 23:46

Вот решение с использованием Bash:

#!/bin/bash

while read pointer; do
 filename="$(echo $pointer | cut -d ' ' -f 1)" 
 if grep $filename list_file > /dev/null; then
  echo $pointer >> output/"$filename".txt
 fi
done < data_file

Вот разбивка по строкам:

  • Строка 3 - это начало используемого цикла while чтобы просмотреть файл_данных.

  • Строка 4 повторяет строку, прочитанную в текущей итерации. Затем строка передается в cut, который вырезает первую часть строки, используя пробел в качестве разделителя. Затем результат присваивается переменной с именем "filename".

  • Строка 5 использует команду grep, чтобы определить, существует ли ранее определенное значение в list_file. Если grep удается найти значение (вернуть статус 0), сценарий переходит к строке 6. Если grep ничего не находит (возвращает статус 1), сценарий запускает цикл заново.

  • Строка 6 отображает всю строку для вывода / "$ filename" .txt.

  • Строка 7 закрывает оператор if.

  • Строка 8 закрывает цикл, и на нее ссылаются data_file.

Другие важные примечания:

  • Каталог «output /» должен быть создан до запуска сценария, иначе вы получите ошибку типа «output: нет такого файла или каталога». Если это проблема, ее можно легко решить, добавив «вывод mkdir» в начало скрипта.
  • Вы упомянули, что файл data_file состоит из сотен тысяч строк. По этой причине выполнение этого сценария, скорее всего, займет много времени. Если вы обнаружите, что часто запрашиваете информацию в этом файле, стоит перевести эту информацию в MariaDB или аналогичную базу данных.
  • Если list_file также содержит много записей, скрипту потребуется безумно много времени для запуска, потому что grep в строке 5 запрашивает весь list_file для каждой итерации цикла. Опять же, это проблема, которую можно решить с помощью инструментов, доступных в базе данных SQL.
0
27.01.2020, 23:46

Теги

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