Эффективный способ поиска массива в текстовом файле с помощью AWK

Bash поддерживает список команд внутри памяти во время работы. Они записываются в .bash_history при выходе :

При выходе из интерактивной оболочки последние строки $ HISTSIZE копируются из списка истории в файл с именем $ HISTFILE

. хотите принудительно записать историю команд, вы можете использовать команду history -a , которая:

Добавляет новые строки истории (строки истории, введенные с начала текущего сеанса Bash) в файл истории.

Также существует опция -w :

Записать текущую историю в файл истории.

, который может вам больше подойти в зависимости от того, как именно вы используете свою историю.

Если вы хотите, чтобы они всегда записывались немедленно, вы можете поместить эту команду в свою PROMPT_COMMAND переменную:

export PROMPT_COMMAND='history -a'

1
20.10.2015, 19:24
2 ответа

Вот один подход, использующий perl .

#!/usr/bin/perl
# read the subscribers
open(A,"<","SPLNO.TXT");
while(<A>) {
 chomp;
 @a=split(/\|/,$_);
 $splnopulse{$a[0]}=$3;
 $splnoamt{$a[0]}=$2;
 $splnomaxlen{$a[0]}=$1;
}
close A;

# read the mdn, looking for matches
open(B,"<","MDN.TXT");
while(<B>) {
 chomp;
 @b=split(/\|/,$_);
 foreach $mdn (keys %splnomaxlen) {
  if($mdn eq $b[0] || "$mdn" eq "91" . $b[0]) {
   print "found\n";
  } else {
   print "not found\n";
  }
 }
}
close B;
0
28.01.2020, 01:33

Алгоритм поиска во всем файле 2 каждой строки в файле 1 имеет временную производительность m * n. где m - количество строк файла 2, а n - количество строк файла 1. Это быстро становится очень медленным.
Решение состоит в том, чтобы сначала отсортировать каждый файл (это n*log(n) времени), а затем сравнить строки между двумя файлами следующим образом:

  1. Пусть i=1 (номер строки файла 1) и j=1 (номер строки файла 2).
  2. Сравните a=(файл 1)[строка i] с b=(файл 2)[строка j].
  3. if a then increment i, return to 2 (проверка на конец файла 1).
  4. if a>b; then increment j, return to 2 (проверка конца файла 2).
  5. if a=b; это совпадение, печатаем его, инкрементируем i.

Время выполнения всего: n + m (время чтения всех строк).

Весь процесс, таким образом, имеет время выполнения: n*log(n) + m*log(m) + n + m.
Что имеет O(n) от: n * log(n) для n > m.

Сортировку легко сделать, просто используйте команду sort для каждого файла:

sort -t '|' -k 1 file01.csv > file01-sorted.csv

Затем выполните приведенную выше процедуру в awk.

Редактирование: Меня только что осенило, что если все 10k номеров SPLNO уникальны (без повторений). И MDN.TXT также имеет уникальные записи. Тогда конкатенация обоих файлов и поиск повторяющихся значений также даст вам решение. Это работает для простого равенства. Регексные совпадения нарушат эту идею в большинстве случаев.

0
28.01.2020, 01:33

Теги

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