Как запросить все строки в файле, которые НЕ равны или суффикс любого имени в другом файле

Архитектура - это тип процессора. Существует лишь относительно небольшое количество архитектур. Все типы процессоров, выполняющие один и тот же пользовательский код, классифицируются как одна и та же архитектура, даже если существует несколько различных способов компиляции ядра; например, x86 и powerpc являются одной архитектурой, но ядро может быть скомпилировано с использованием 32-битного набора инструкций или 64-битного набора инструкций (и 32-битное ядро может выполнять только 32-битные программы, а 64-битное ядро может выполнять как 32-битные, так и 64-битные программы).

Платформа описывает все остальное об аппаратном обеспечении, о котором заботится Linux. Сюда входят вариации того, как работает загрузка, как работают некоторые периферийные устройства, такие как контроллер памяти, сопроцессор управления питанием, криптографические ускорители и т.д. и т.п. Классифицируются ли функции в зависимости от платформы или являются отдельными драйверами или опциями компиляции, зависит отчасти от того, насколько фундаментальна эта функция (т.е. насколько сложно изолировать код, который ее использует), а отчасти от того, как решил поступить тот, кто кодировал ее поддержку.

0
29.07.2018, 17:43
2 ответа

Понятия не имею, насколько это будет эффективно, учитывая ваш вклад,но вот возможная стратегия:

  1. превратить строки file2в строку -закрепленные шаблоны регулярных выражений

    sed -e 's/\./\\./g' -e 's/$/\$/' file2
    
  2. передать шаблоны в grep для вывода только совпадающих частейfile1

    ... | grep -of - file1
    
  3. (необязательный )унифицировать результаты

  4. обычный -текстовый поиск file2совпадающих записей

    ... | grep -vxFf - file2
    

Пр.

$ sed -e 's/\./\\./g' -e 's/$/\$/' file2 | 
    grep -of - file1 | 
    sort -u | 
    grep -vxFf - file2
123.com

Если записи в file2содержат регулярное выражение -специальные символы помимо ., их также необходимо экранировать.

0
28.01.2020, 04:16

Первое решение, которое я попробовал (ниже есть более быстрая альтернатива )похоже на то, что представил @steeldriver. Однако значения в файле2 должны иметь начальную точку, чтобы избежать совпадения строки типа a.bb.comв cc.aa.bb.com. Совпадения должны иметь точку в качестве разделителя. Делаем это в четыре шага:

n=100
echo "step1  ==============="
time head -n $n file2 | sort | tee file222 | sed 's/\./\\./g;s/^/\\./;s/$/$/' >file22
echo "step2  ==============="
time sed 's/^/./' file1 | head -n $n > file11
echo "step3  ==============="
time grep -oEf file22 file11 | sort -u | sed 's/^\.//' >file33
echo "step4  ==============="
time comm -13 file33 file222 > fileout

Но время увеличивается как квадрат n, это довольно быстро для менее 1000строк (обоих файлов ). Но он растет на порядок 475дней (больше, чем за год )на 1 миллион строк. Явно не жизнеспособное решение.

Вариант б

Не очень интуитивный вариант — развернуть файл1 на все его составляющие.
Процесс, аналогичный расширению aa.ff.bb.comдо:

aa.ff.bb.com
ff.bb.com
bb.com
com

А затем, после удаления повторяющихся строк в этом файле, найти все строки, существующие только в (отсортированном )файле2.

Этап сортировки (и удаления повторов )занимает больше всего времени, но, поскольку он составляет порядка 8 секунд для файлов с 1 миллионом (уникальных )строк, это вполне разумно.

Весь процесс (, включая создание исходных файлов ), является:

#!/bin/bash
TIMEFORMAT='%R %U %S'

echo $'bb.com\na.com\n123.com' >file2
printf '%s\n'        {a..z}{a..m}.{a..z}{a..m}.{com,net,dot} >>file2
echo $'aa.bb.com\naa.ff.bb.com\naa.bb.cc.com\na.com' >file1
printf '%s\n' {h..k}.{e..z}{a..m}.{e..z}{a..m}.{com,net,dot} >>file1

echo "file2 has $(wc -l <file2) lines"
echo "file1 has $(wc -l <file1) lines"

n=10000000
time sed -n 'p;:1;s/[^.]*\.//p;t1' file1 >file1b1
echo "file1b1 has $(wc -l <file1b1) lines"
time sort -u file1b1 | head -n $n >file1b2
echo "file1b2 has $(wc -l <file1b2) lines"
time sort -u file2   | head -n $n >file2b2
time comm -13   file1b2 file2b2   >fileout

Это печатает эти результаты:

file2 has 342735 lines
file1 has 981556 lines
4.353 4.248 0.096
file1b1 has 3926221 lines
8.649 15.024 0.488
file1b2 has 1227809 lines
0.618 0.908 0.112
1.011 0.968 0.032

Порядка 15 секунд.

0
28.01.2020, 04:16

Теги

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