Удалить строку для второго CSV, если поле в CSV 2 и CSV 1 имеет совпадение полей - PullRequest
0 голосов
/ 30 января 2020

У меня есть 2 CSV и я, который выглядит примерно так:

CSV 1

ID
001
002

CSV 2

ID   Name   Optin   Date
001  Adam   TRUE    2020/01/01
002  Eve    TRUE    2019/11/01
003  John   FALSE   2019/07/22

Я хотел бы только строку с ID 003 в выходном файле, пожалуйста. Поскольку между 3-5 миллионами строк, должно быть что-то в терминале, а не в превосходстве.

Извините, таблицы выглядят так плохо.

Заранее спасибо.

1 Ответ

2 голосов
/ 31 января 2020

Не могли бы вы попробовать следующее:

awk 'NR==FNR {if (FNR>1) seen[$1]++; next} !seen[$1] {print}' csv1.txt csv2.txt

Строки прерваны для объяснения:

awk '
    NR==FNR {
                        # this block is evaluated while reading csv1.txt only
        if (FNR > 1)    # skip the header line of csv1.txt
            seen[$1]++  # memorize the occurance of the ID
        next            # prevents from continuing to the next block
    }
                        # the lines below is evaluated while reading csv2.txt only
    ! seen[$1] {        # if the ID is not in the array (not included in csv1.txt)
        print           # then print the row
    }
' csv1.txt csv2.txt
  • Условие NR==FNR выполняется только при чтении первого файла в список аргументов (csv1.txt в данном случае). Это общая идиома для выполнения разных кодов для каждого файла.
  • Оператор seen[$1]++ устанавливает метку в 1-м поле строки ввода. Вы можете легко узнать, включен ли идентификатор в csv1.txt при обработке csv2.txt.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...