имеют два списка, хотите исключить список2 из List1

Одна вещь, которая поможет вам для форматирования вывода - это awk. Например:

date | awk '{printf "%-10s %-10s %-10s %-10s %-10s %-10s\n", $1, $2, $3, $4, $5, $6}'

даст вывод в полях шириной 10 символов.

0
02.09.2018, 08:16
3 ответа

Попробуйте это,

awk -F ',' 'NR==FNR{a[$1]++;next};a[$1] == 0'  List2  List1

2,name2                    
4,name4                   
5,name5                  
8,name8                  
9,name9
  • a[$1]++; next:сохраняет 1-е поле в массиве. Затем
  • a[$1] == 0:блок else будет выполняться, только если это второй файл, поэтому мы проверяем, было ли уже просмотрено поле 1 этого файла(a[$1]==0).
0
28.01.2020, 02:18

Предполагая, что bashиспользуется (, в противном случае предварительно -отсортируйте входные файлы с помощью sort -o List1 List1и sort -o List2 List2и используйте List1 List2вместо подстановок процесса):

$ join -t, -v1 <( sort List1 ) <( sort List2 )
2,name2
4,name4
5,name5
8,name8
9,name9

Это выполняет реляционную операцию JOIN между вашими двумя файлами, сначала сортируя их содержимое. -t,указывает joinрассматривать запятые как разделитель полей, а с помощью -v1мы запрашиваем записи в первом файле, которые не соединяются ни с одной записью во втором. Объединение происходит по умолчанию в первом поле каждого файла.

Чтобы убрать последнее целое число из этого:

join -t, -v1 <( sort List1 ) <( sort List2 ) | sed 's/[0-9]*$//'

Для решения MySQL вам пришлось бы предоставить схему SQL для задействованных таблиц, но результирующий запрос выглядел бы примерно так

SELECT * FROM table1 WHERE joinfield1 NOT IN (SELECT joinfield2 FROM table2);
5
28.01.2020, 02:18

Использованиеgrep:

grep -wvf List2 List1

Выход:

2,name2
4,name4
5,name5
8,name8
9,name9
0
28.01.2020, 02:18

Теги

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