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

От: https://acceptsocket.wordpress.com/2014/08/12/set-solarized-dark-as-default-color-scheme-for-linux-virtual-console/

if [ "$TERM" = "linux" ]; then
echo -en "\e]P0073642" #black
echo -en "\e]P8002b36" #brblack
echo -en "\e]P1dc322f" #red
echo -en "\e]P9cb4b16" #brred
echo -en "\e]P2859900" #green
echo -en "\e]PA586e75" #brgreen
echo -en "\e]P3b58900" #yellow
echo -en "\e]PB657b83" #bryellow
echo -en "\e]P4268bd2" #blue
echo -en "\e]PC839496" #brblue
echo -en "\e]P5d33682" #magenta
echo -en "\e]PD6c71c4" #brmagenta
echo -en "\e]P62aa198" #cyan
echo -en "\e]PE93a1a1" #brcyan
echo -en "\e]P7eee8d5" #white
echo -en "\e]PFfdf6e3" #brwhite
clear #for background artifacting
fi

Я добавил это в свой файл .bashrc на Ubuntu 14.04.03, и он изменил мой виртуальный терминал на Solarized Dark

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

6 ответов

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

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
ответ дан 22 May 2018 в 16:45
  • 1
    Это прекрасно работает, спасибо вам большое! Я только начал работать с Linux, надеюсь, что смогу помочь кому-то в будущем, как вы помогли мне сегодня. Еще раз спасибо! – Bollie 6 November 2017 в 15:44
  • 2
    @Bollie Если этот ответ решил вашу проблему, пожалуйста, уделите минутку, а примите ее , нажав на галочку слева. Это ответит на вопрос как ответ, и именно так выражаются на сайтах Stack Exchange. – terdon♦ 6 November 2017 в 18:19

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

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
ответ дан 18 July 2018 в 03:48

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

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
ответ дан 24 July 2018 в 17:56

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; если нет, внести необходимые изменения в шаблон glob *.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

EDIT:

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

[ f3]
3
ответ дан 22 May 2018 в 16:45

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; если нет, внести необходимые изменения в шаблон glob *.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

EDIT:

Если вы хотите сохранить вывод каждого файла, обрабатываемого в соответствующем файле, с помощью .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
ответ дан 18 July 2018 в 03:48

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; если нет, внести необходимые изменения в шаблон glob *.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

EDIT:

Если вы хотите сохранить вывод каждого файла, обрабатываемого в соответствующем файле, с помощью .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
ответ дан 24 July 2018 в 17:56

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

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