Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Bash Ограничение длины результата содержимого каталога https://www.cyberforum.ru/ shell/ thread2712222.html
Здравствуйте! Необходимо реализовать следующую команду: вывести на экран содержимое каталога /usr/share. Ограничьте длину результата 30 символами. Не могу понять какой командой ограничить длину...
Bash Планирование в bash
Создать расписание выполнения заданий так, чтобы каждый день в какое то определённое время создавался сжатый архив данных одной директории и перемещался в папку архивов другой директории. Надо...
Кириллица в bash Bash
Привет всем. Использую imagemagick и хочу наложить русский текст на фото командой: convert -font font.ttf -fill '#7f7278' -pointsize 55 -gravity center -draw "text 0,0 'Машенька'" white.png...
Bash Шаблон скрипта CYGWIN для последовательного выполнения команд кто-нибудь может посоветовать простой шаблон скрипта для последовательного выполнения с pipe нескольких вычислительных команд с аргументами и с записью результатов в файл. Команды отдельно есть... https://www.cyberforum.ru/ shell/ thread2710251.html
Bash Bash: не понятен момент https://www.cyberforum.ru/ shell/ thread2710219.html
# Создаем временную директорию: firefox_tempdir="$( mktemp -d ~/firefox_tempdir.XXXXXX )"; # Качаем архив.. # Указываем путь до скаченного ахрива:...
Проверка настройки сети в Ubuntu через скрипт Bash Bash
Прошу помощи в решении проблемы, в создании скриптового файла для проверки настройки сети в Ubuntu Необходимо проверить два адреса: ping 8.8.8.8 ping ya.ru Вопрос: какие команды добавить,...
Bash bash на весь экран
Здравствуйте. Подскажите, как сделать, чтобы при запуске терминала в LXDE он сразу запускался на весь экран? До этого в убунте я добавлял строку wmctrl -r :ACTIVE: -b...
Bash Определить mac адреса всех доступных dhcp серверов Доброго времени суток. Подскажите пожалуйста как получить список mac адресов всех доступных dhcp серверов в локальной сети. https://www.cyberforum.ru/ shell/ thread2709410.html
Bash Ищу аналог matplotlib для bash https://www.cyberforum.ru/ shell/ thread2708886.html
Есть аналог matplotlib для bash?
Bash Создание Dockerfile для запуска nano Само задание: создать Dockerfile для образа, который будет удовлетворять следующим свойствам: 1. Базовый образ – ubuntu:16.04 2. Установлен текстовый редактор nano 3. Переменная окружения... https://www.cyberforum.ru/ shell/ thread2707382.html
Bash Удаление строк с НЕуникальным идентификатором https://www.cyberforum.ru/ shell/ thread2707266.html
Доброго времени суток. Возникла необходимость сделать выборку строк из списка файлов, оставив только последнюю версию имени файла в списке. Что-то типа ...
Bash weather+clock #!/bin/bash # # Author: Twily 2014 # unhide_cursor() { printf "\ehttps://midzer.github.io/wttr-switcher/ curl -s 'ru.wttr.in/{Коркино,Челябинск,Калачёво}?format=3' toilet -f future... https://www.cyberforum.ru/ shell/ thread2705915.html
Эксперт NIX
1418 / 577 / 204
Регистрация: 28.06.2015
Сообщений: 1,284
Записей в блоге: 16
16.10.2020, 20:14 0

awk и удаление лишних строк

16.10.2020, 20:14. Просмотров 1086. Ответов 4
Метки (Все метки)

Ответ

apeshand, Судя по уровню ваших вопросов, рискну объяснить своими словами, думаю это будет полезней, но все равно вам стоит хотя бы по диагонали пролистать ман страничку man awk.
PROCINFO это внутренняя переменная - массив, через который можно влиять на работу процессора awk в том числе и сортировку. Попробуйте изменить значение с "@ind_str_asc" на "@ind_str_desc" и получите обратную сортировку по убывающей. Заметно невооруженным глазом, что значение состоит из трех объектов, читаю с переводом на русский по порядку @индекс_строка_поВозростанию, следующая - @индекс_строка_поУбыванию. Индекс - в данном случае имеется ввиду ключ
NR==FNR {A[$0]; next} Предполагает что процессор работает с несколькими файлами и массив из всех строк первого файла создается в переменной А. Я написала один и тот же файл в программе два раза, применяя "Расскрытие скобок", первый раз читая файл процессор создает массив, а второй производит обработку с записью в другой массив D. Расскрытие скобок или Brace Expantion хорошо наблюдать через команду echo:
Bash
1
2
echo 1{a,b,c}
1a 1b 1c
или как в нашем случае:
Bash
1
2
echo file{,}
file file
Получим как видите 2 файла. Их можно в программе так и указать безо всяких раскрытий скобок. Кстати, два файла нужны в моем случае из за того, что порядок следования строк перемешан и зачастую более короткое значение идет после длинного и необходимо к моменту обработки иметь полную базу всех вариантов.
Что касается вот этой конструкции {a=$0; NF-=1; if(!($0 in A)) D[a]}, давайте немного изменим программу и возьмем в качестве аргумента ваш первоначальный пример входного файла:
Bash
1
2
3
4
5
6
7
awk '
NF == 1 {a=$0; NF=0; if (!($0 in D)) D[a]}
NF == 2 {a=$0; NF=1; if (!($0 in D)) D[a]}
NF == 3 {a=$0; NF=2; if (!($0 in D)) D[a]}
NF == 4 {a=$0; NF=3; if (!($0 in D)) D[a]}
END     {for(i in D) print i}
' file
Смотрите что получается, я начну объяснять со второй строчки программы. В строке тело выполняется если строка состоит из двух слов (полей), переменная NF количество полей в строке. Мы присваиваем переменной a всю строку целиком, чтобы не потерять это значение, потому что следующая операция не обратима. Урезаем количество полей на единицу NF=1. Теперь у нас вся строка определенная в переменной $0 урезается на одно - последнее поле, и там ноходится только первое. Теперь проверяем есть ли совпадение в ключе массива D, если нет, добавляем в массив значение (0 по умолчанию) с ключем - первоначальной, не урезанной, полной строкой. Это дает нам возможность применить нежадный алгоритм - то есть по короткому совпадению.
Возвращаемся и видим что одна строчка в боевой программе является универсальной и заменяет множество возможных вариантов из учебной.
Как только скрипт обработает значения и создаст результирующий массив данных, можно прочитать его ключи в цикле и вывести на экран. То есть уже после того как файлы будут прочитаны. Аналог END {for(i in D) print i} на баше будет:
Bash
1
2
3
for i in ${!D[@]};
  do echo $i;
done


Вернуться к обсуждению:
awk и удаление лишних строк
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2020, 20:14
Готовые ответы и решения:

Сцепка текста в ячейках, если совпадают значения в столбце А, удаление повторов имен, удаление лишних строк
Добрый день, подскажите, как решить задачу: Есть список организаций с контактами. Одна организация...

Сортировка и удаление лишних строк
Помогите с кодом сортировки. В общем в текстовую строку пишите номер магазина, все записи с этим...

Удаление лишних строк в reg-файле
Приветствую всех ! К примеру имеется дамп ветки реестра HKLM\SYSTEM\CurrentControlSet\services...

Удаление лишних строк - доделать макрос
Приветствую знатоков и прошу помочь доделать код. Есть текстовые данные, разбитые постранично. На...

4
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.