перейдите к системе> предпочтение>, мышь, в "дважды щелкают, тайм-аут" раздел установил скорость двойного щелчка.
существуют более усовершенствованные способы настроить его, но кажется, что этот может разрешить Вашу проблему.
Можно использовать awk
для этого:
awk 'FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3
Объяснение:
FNR == NR
: Этот тест верен, когда количество записей равно количеству записей в файле. Это только верно для первого файла для второго файла NR
будет равно количеству строк file1 + FNR
.
a[$1]
: Создайте индекс элемента массива первого поля file1.
next
: пропустите к следующей записи, таким образом, больше обработки не сделано на file1.
!($1 in a)
: Посмотрите, присутствует ли первое поле (1$) в массиве, т.е. в file1, и распечатайте целую строку (к file3).
На основе одного из примеров от #awk Wiki.
export LC_ALL=C
comm -13 <(sort f1) <(sort f2)
Сообщили бы строки, которые находятся только в f2
.
export LC_ALL=C
join -v2 <(sort f1) <(sort f2)
Сообщили бы строки f2
чье первое поле не найдено как первое поле ни в какой строке f1
.
(Вам нужна оболочка с поддержкой замены процесса как ksh93
, zsh
или bash
).
Только для забавы вот решение в Perl:
#!/usr/bin/perl
# create names lookup table from first file
my %names;
while (<>) {
(my $col1)= split / /, $_;
$names{$col1} = 1;
last if eof;
}
# scan second file
while (<>) {
print if /^(\S+).*/ && not $names{$1};
}
$ ./showdiffs.pl file1 file2
0BDB FC600_R5_TP FX.B 33554640 6044364 18 6033105 18 6044364 0
0BDC FC600_R5_TP FX.B 33554640 6613536 20 6481974 19 6613536 0
0BDD FC600_R5_TP FX.B 33554640 4435848 13 4057170 12 4435848 0
0BDE FC600_R5_TP FX.B 33554640 6620868 20 6249518 19 6620868 0
Решение для Perl выше состоит из 2 циклов. Первый цикл читает все строки в из file1
и создает хеш, %names
где каждый столбец, который мы определяем, добавляется.
$names{11AA} = 1;
2-е while
цикл затем работает на основе 2-го файла, file2
, и столбец 1 каждой строки определяется с помощью регулярного выражения:
^(\S+).*
Вышеупомянутое говорит с начала строки, соответствуйте всему, что не является пространством, и сохраните его во временной переменной $1
. Это сохраняется путем обертывания parens вокруг этого. .*
говорит для соответствия всему остальному на строке.
Следующий бит этого, которое строки говорят для поиска столбца 1 бит, в котором мы просто сохранили $1
в %names
хеш:
$names{$1}
Если это присутствует там, то мы не хотим печатать его. Если это не там, то распечатайте его.
Метод 1# Bash
#!/usr/bin/env bash
file1=$1
file2=$2
[[ $# -ne 2 ]] && { echo -e "\n\tUsage: \t$0 file1 file2\n"; exit 1; }
while read line
do
if ! grep -q "${line%% .*}" $file1; then
echo "${line}"
fi
done < $file2
Метод 2# только Grep
grep -v "$(< file1)" file2
grep Работает, но не гарантия
Файл #1: file1.txt
Файл #2: file2.txt