Сравните два файла с первым столбцом и удалите дублирующуюся строку из 2-го файла в сценарии оболочки

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

существуют более усовершенствованные способы настроить его, но кажется, что этот может разрешить Вашу проблему.

9
26.09.2015, 17:18
5 ответов

Можно использовать 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.

10
27.01.2020, 20:04
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).

8
27.01.2020, 20:04

Только для забавы вот решение в 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}

Если это присутствует там, то мы не хотим печатать его. Если это не там, то распечатайте его.

2
27.01.2020, 20:04

Метод 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 Работает, но не гарантия

2
27.01.2020, 20:04
[1133467]Получим как

Файл #1: file1.txt

Файл #2: file2.txt

  1. Затем запустим на терминале
  2. output.txt и получим нужный результат.
  3. Пояснение:
1
27.01.2020, 20:04

Теги

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