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.
/etc/msmtprc
: aliases /etc/aliases.msmtp
/etc/aliases.msmtp
, содержащий эту строку: default: christophe.detroyer@gmail.com
Попробуйте это с 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
, какой бы ни была ваша конкретная установленная версия. Если у вас остались вопросы после некоторого серфинга, просто спросите подробности.
Держу пари, кто-нибудь найдет способ сделать это еще проще. ;-)
Предполагая, что оба файла отсортированы лексикографически (с, например,.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
вместо этого мы получаем непарные строки из первого файла.
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