Выполнение команды для первого столбца с использованием функции system() в awk

Технология совместной базы данных -Плоские файлы для хранения данных, работающие в тандеме с файлами Perl SDBM с парами ключ/значение, привязанными к хэш-таблицам программы, для постоянной индексации с произвольным доступом к фиксированным -смещениям длины записей (в байт ). Это реализация системы баз данных ISAM/NoSql. ПОСМОТРЕТЬ:http://www.perlmonks.org/?node_id=1121222

Базы данных плоских файлов с «текстовыми» данными, хранящимися в записях фиксированной -длины, могут быть настроены для мгновенного произвольного доступа с использованием двоичных файлов SDBM с парами ключ/значение, привязанными к хеш-таблицам программы, где «значение» — это смещение записи в байтах для позиционирования указателя файла, а ключом является :одно поле, частичное поле или несколько отдельных и/или частичных полей, объединенных вместе, из данных, содержащихся в записях плоского файла.

Примерами полей, которые можно использовать в качестве UNIQUE ключа, могут быть номер социального страхования, или номер кредита, или номер счета.

Вы можете настроить несколько индексов файлов SDBM для ваших плоских файлов, каждый файл SDBM будет содержать различный набор пар ключ/значение в зависимости от того, какие поля или частичные поля составляют «ключ». Индексы ALTERNATE с DUPLICATES можно использовать, добавляя последовательность nbr к «ключу».

Можно использовать отдельный плоский файл, который содержит множество дочерних записей относительно каждой отдельной записи PARENT, содержащейся в другом плоском файле. Пример :Плоский файл КРЕДИТ (Родитель )и Плоский файл ЗАЛОГА (ДЕТИ ), где ДЕТИ — это все залоговое обеспечение, обеспечивающее каждый конкретный кредит в рассрочку.

Я использую ПЛОСКИЕ ФАЙЛЫ до 4 ГБ каждый и файлы SDBM до 2 ГБ каждый.

Данные могут быть логически разделены для простоты как произвольного, так и последовательного доступа. Пример :US _Census _2010 _TX _A.dat может быть плоским файлом, содержащим данные только о гражданах Техаса, чья фамилия начинается с буквы «A».У вас может быть 50 подкаталогов STATE, содержащих 26 плоских файлов в каждом (один для A -Z ). Пакетное приложение или пользовательский -интерфейс могут получить доступ к правильному файлу, если понимают соглашение об именовании файлов Flat File и SDBM.

ПРИМЕЧАНИЕ. :Аналогичный метод можно использовать для создания огромной базы данных MS -ACCESS (собственно MS -Jet "Red" Engine ), доступ к которой осуществляется через ODBC, так что каждая *Файл.MDB содержит только один или несколько обратных -конечных ТАБЛИЧНЫХ ОБЪЕКТОВ, и каждый файл MDB действует как :отдельная таблица, группа таблиц или неполная таблица, общая для всех файлов MDB. Файлы MDB сами по себе не являются базой данных -, как это обычно бывает. Это просто контейнеры для хранения огромных объемов данных, логически разделенных и проиндексированных для оптимизированного последовательного и произвольного доступа. MS -Access имеет свои собственные возможности индексирования, поэтому SDBM здесь не будет использоваться для индексирования. MS -Программное обеспечение Access не требуется, так как утилита администратора MDAC и ODBC устанавливается на заводе в Windows 7. Используйте администратора ODBC для создания пустых файлов MDB и используйте язык программирования для выполнения операторов SQL, которые создают таблицы и индексы для эти таблицы.

4
07.08.2019, 12:50
3 ответа

Вы можете сделать следующее

Шаг 1:

./my_program | awk '/^10./{a[$1]++ } END { for(i in a) print i,a[i]}' | tee some_file | xargs -I{} dig +short -x {} > some_file2

Шаг 2:

paste <(awk '{print $1}' some_file ) <(awk '{print $1}' some_file2 ) > result

Вы можете удалить some_fileи some_file2, если хотите.rm some_file some_file2

1
27.01.2020, 20:50

Вы можете использовать функцию split(), чтобы разделить комбинацию IP/порт и получить IP для последующего использования в команде dig().

END { 
  for(i in a) {
    split(i, ip)
    cmd=sprintf("dig +short -x \"%s\"", ip[1])
    (cmd | getline type) > 0 ? "" : type="notResolved"
    printf("%s %s %s\n",i,a[i],type);
    close(cmd)
  }
}

Я добавил способ проверки состояния команды digи использовал тернарный оператор ?для обновления значения типа. В случае сбоя вы можете добавить свою собственную строку (, например 'notResolved'в приведенном выше ), и распечатать результат.

Обратите внимание, что использование вызова getline()в awkотличается от использования вызова system(). Тип cmd | getline varиспользует каналы, как если бы cmdзапускается из оболочки, каждый вызов getline varсчитывает одну строку вывода из команды. Однако команда system()не дает возможности получить вывод команды, выполненной внутри. У вас есть доступ только к коду выхода, возвращаемому командой, запущенной внутри.

П.С. Ответ частично взят из полезных комментариев муру.

6
27.01.2020, 20:50

Вы также можете вообще не использовать awk. Немного медленнее (, хотя и использует такое же количество вызовов dig), но, вполне возможно, более читаемо.

while read -r ip count
do
    printf "%s %s %s\n" "$ip" "$count" "$(dig +short -x "$ip" | xargs)"
done < ipaddresses.txt
0
27.01.2020, 20:50

Теги

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