Bash поддерживает список команд внутри памяти во время работы. Они записываются в .bash_history
при выходе :
При выходе из интерактивной оболочки последние строки $ HISTSIZE копируются из списка истории в файл с именем $ HISTFILE
. хотите принудительно записать историю команд, вы можете использовать команду history -a
, которая:
Добавляет новые строки истории (строки истории, введенные с начала текущего сеанса Bash) в файл истории.
Также существует опция -w
:
Записать текущую историю в файл истории.
, который может вам больше подойти в зависимости от того, как именно вы используете свою историю.
Если вы хотите, чтобы они всегда записывались немедленно, вы можете поместить эту команду в свою PROMPT_COMMAND
переменную:
export PROMPT_COMMAND='history -a'
Вот один подход, использующий 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;
Алгоритм поиска во всем файле 2 каждой строки в файле 1 имеет временную производительность m * n
. где m
- количество строк файла 2, а n
- количество строк файла 1. Это быстро становится очень медленным.
Решение состоит в том, чтобы сначала отсортировать каждый файл (это n*log(n) времени), а затем сравнить строки между двумя файлами следующим образом:
a=(файл 1)[строка i]
с b=(файл 2)[строка j]
. if a then increment i, return to 2 (проверка на конец файла 1).
if a>b;
then increment j, return to 2 (проверка конца файла 2). 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 также имеет уникальные записи. Тогда конкатенация обоих файлов и поиск повторяющихся значений также даст вам решение. Это работает для простого равенства. Регексные совпадения нарушат эту идею в большинстве случаев.