Как удалить строки из файлов на основе значений ключей в другом файле

The next thing I want to configure is that my email for my root account (e.g., output from crontabs) is sent to my isp email as well.

  1. Добавьте такую ​​строку на/etc/msmtprc:
   aliases /etc/aliases.msmtp
  1. Создайте файл /etc/aliases.msmtp, содержащий эту строку:
   default: christophe.detroyer@gmail.com
-3
30.08.2021, 16:59
3 ответа

Попробуйте это с GNUawk:

Решение 1:

$ awk 'NR==FNR {a[$0]} FNR!=NR {printf("%s",!($1 in a)? $0"\n": "")}' file2 file1
3 a aa
4 b bb
6 b bb
7 a aa
8 b bb

Это 1-е решение выглядит излишне надуманным, с тернарным оператором !($1 in a)? $0"\n": ""внутри блока printf. Я просто предлагаю это для общности, имея в виду, что если вместо простого удаления ненужных строк по вашей схеме вы когда-нибудь захотите заменить их на my_string, вы можете просто поместить my_string\nвнутри пустой строки "".

Решение 2:

$ awk 'NR==FNR {a[$0]} FNR!=NR && !($1 in a) {print $0}' file2 file1

, который можно упростить до:

$ awk 'NR==FNR {a[$0]} FNR!=NR && !($1 in a)' file2 file1

, потому что awkпо умолчанию печатает всю запись ($0).

man awkдаст вам очень хорошее представление о awk, какой бы ни была ваша конкретная установленная версия. Если у вас остались вопросы после некоторого серфинга, просто спросите подробности.

Держу пари, кто-нибудь найдет способ сделать это еще проще. ;-)

1
30.08.2021, 17:49

Предполагая, что оба файла отсортированы лексикографически (с, например,.sort -b)в первом столбце:

$ join -v 1 file1 file2
3 a aa
4 b bb
6 b bb
7 a aa
8 b bb

При этом используется утилита joinдля извлечения всех строк из file1, первый столбец которых не соответствует ни одному из значений в file2.

Поведение по умолчанию joinзаключается в создании ВНУТРЕННЕГО СОЕДИНЕНИЯ на основе первого столбца обоих файлов, но с -v 1вместо этого мы получаем непарные строки из первого файла.

3
30.08.2021, 19:03
awk 'NR==FNR{a[$1];next}!($1 in a){print $0}' file2 file1

выход

3   a   aa
4   b   bb
6   b   bb
7   a   aa
8   b   bb
0
30.08.2021, 19:08

Теги

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