Сценарий для сортировки содержания нескольких файлов в каталоге

Хороший день, я должен собрать историю просмотра определенных людей каждый месяц, и я - общий новичок Linux. Я хотел бы во-первых sort веб-сайты затем выполненный a uniq -u. Вывод программа, которую я использую, похож на это -

==================================================
URL               : http://example.com/
==================================================
==================================================
URL               : http://example.com/en
==================================================
==================================================

Существует приблизительно 30 из них в папке /history названный, например, bob.txt, tim.txt и т.д. Действительно ли возможно сделать сценарий, который сортирует содержание во всех файлах в каталоге, удаляет весь = знаки, удаляет дубликаты и сохраняет результат в новом файле, например, bob.doc, tim.doc?

В данный момент я вручную работаю sort bob.txt | uniq -u > bob.doc

3
задан 6 November 2017 в 12:50

2 ответа

Это работает, по крайней мере, для примера, который Вы дали:

for i in *.txt; do
  sed '/=/d;s/URL *: //' "$i" |
  sort -u > "${i%%.txt}".doc
done

Объяснения

  • for i in *.txt; do … done – цикл по каждому .txt файл в текущем каталоге
  • sed '/=/d;s/URL *: //' – удалите каждое начало строки =, удалите материал перед URL в каждой строке
  • sort -u – вид и вывод только первое из равного выполнения
  • > "${i%%.txt}".doc – перенаправьте вывод к, например. bob.doc для входного файла bob.txt (использование расширения Параметра)
7
ответ дан 1 December 2019 в 13:08

GNU awk (значение по умолчанию в Ubuntu) - один:

awk -vFPAT='https?:[^\\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
            /\w+/{a[$1]} END{for(i in a) print i}' *.txt
  • Принятие всех входных файлов заканчивается в .txt; в противном случае внесите необходимые изменения в шаблоне шарика *.txt

  • Переменная FPAT устанавливает использование определения поля Regex, мы определили часть записей, запускающихся с http с дополнительным s после этого, сопровождаемый :, до следующего пробела как поле шаблоном Regex https?:[^\\s]+'

  • awk только ассоциативные массивы поддержек, которые не отсортированы по умолчанию (хорошо, отсортированный согласно внутреннему хешу - это - деталь реализации), мы определяем порядок сортировки массива a согласно индексным строкам с помощью ассоциативного массива PROCINFO с ключом sorted_in наличие значения @ind_str_asc PROCINFO["sorted_in"]="@ind_str_asc". Если Вы хотите упорядочение по убыванию, использовать PROCINFO["sorted_in"]="@ind_str_desc"

  • Наконец, END{for(i in a) print i} выполняет итерации по элементам массива a и печатает ключи сортированного массива.


Если Вы хотите сохранить вывод в файл, например. out.txt:

awk -vFPAT='https?:[^\\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
            /\w+/{a[$1]} END{for(i in a) print i}' *.txt >out.txt

Править:

Если Вы хотите сохранить вывод каждого файла, обрабатываемого в соответствующем файле с .txt расширение, замененное .doc, рычаги awk переменная FILENAME получить имя файла, sub(".txt$", ".doc", FILENAME сделать переименование и ENDFILE сделать обработку матриц в конце каждой обработки файла:

awk -vFPAT='https?:[^\\s]+' 'BEGIN {PROCINFO["sorted_in"]="@ind_str_asc"} \
           /\w+/{a[$1]} ENDFILE{sub(".txt$", ".doc", FILENAME); \
                  for(i in a) print i > FILENAME}' *.txt
3
ответ дан 1 December 2019 в 13:08

Другие вопросы по тегам:

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