Одна вещь, которая поможет вам для форматирования вывода - это awk
. Например:
date | awk '{printf "%-10s %-10s %-10s %-10s %-10s %-10s\n", $1, $2, $3, $4, $5, $6}'
даст вывод в полях шириной 10 символов.
Попробуйте это,
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
). Предполагая, что 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);
Использованиеgrep
:
grep -wvf List2 List1
Выход:
2,name2
4,name4
5,name5
8,name8
9,name9