ОП попытался выполнить следующую строку:
for i in $(awk '{print $1}' list.txt); do grep -v -w $i master.txt; done;
Эта строка не будет работать, так как для каждой записи $i
, вы печатаете все записи в master.txt
tat не эквивалентны до "$i"
. Как следствие, вы получите несколько копий master.txt
, в каждой из которых будет отсутствовать одна строка.
Пример:
$ for i in 1 2; do grep -v -w "$i" <(seq 1 3); done
2 \ copy of seq 1 3 without entry 1
3 /
1 \ copy of seq 1 3 without entry 2
3 /
Кроме того, попытка прочитать файл master.txt
несколько раз. Это очень неэффективно.
Инструмент unix grep
позволяет проверить несколько выражений, хранящихся в файле в одном go. Это делается с помощью флага -f
. Обычно это выглядит следующим образом:
$ grep -f list.txt master.txt
ОП теперь может использовать это следующим образом:
$ grep -vwf <(awk '{print $1}' list.txt) master.txt
Но это будет соответствовать по всей строке.
Решение awk , представленное Kent , является более гибким и позволяет OP определять более настроенное соответствие:
awk 'NR==FNR{a[$1]=1;next}!a[$1]' list master
Здесь OP ясно заявляет, что я хочу сопоставить столбец 1 списка с столбец 1 мастера, и меня не волнуют пробелы или что-либо еще в столбце 2. Решение grep может по-прежнему соответствовать записям в столбце 2.