Как сравнить два файла, а затем добавить строку, которая не является частичным совпадением?

Доступна новая версия xsnow, которая работает в большинстве настольных сред. Эта версия доступна для тестирования Debian -, а последняя версия находится на sourceforge :

.

https://sourceforge.net/projects/xsnow/

4
20.12.2020, 17:43
4 ответа

Вы можете анализировать файлы с помощьюawk

awk -F '/' '
    FNR == NR {seen[$1] = $0; next}
    {if ($1 in seen) print seen[$1]; else missing[$1]}
    END {for (x in missing) print x}
' Temp.txt Extensions.txt

Выход:

1234/sip:1234@192.168.1.10:5060 9421b96c5e Avail 1.480
4321/sip:4321@192.168.1.11:5060 e9b6b979a4 Avail 1.855
111
  • Установить разделитель полей на косую черту,-F '/'
  • Действие после FNR == NRвыполняется для строк первого входного файла. Сохраняем строки в ассоциативном массиве seenкак ключи и переходим к строке next.
  • Второе действие выполняется для второго файла, когда FNR != NR. Если первое поле совпадает, мы печатаем сохраненную строку, elseсохраняем поле в другой массив missing.
  • В ENDмы печатаем недостающие строки.
5
18.03.2021, 22:49

Вы можете прочитать содержимое Extensions.txtв массив, удалить частичные совпадения, а затем распечатать то, что осталось:

$ awk -F/ '
    NR==FNR {a[$1]; next} {for(i in a) if($1 ~ i) delete a[i]} END{for(i in a) print i} 1
  ' Extensions.txt Temp.txt
1234/sip:1234@192.168.1.10:5060  9421b96c5e   Avail   1.480
4321/sip:4321@192.168.1.11:5060  e9b6b979a4   Avail   1.855
111
3
18.03.2021, 22:49

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

grep -xvFf <(cut -d'/' -f1 tmp) ext >> tmp

Здесь мы в безопасности, grepиспользуя tmpдля подстановки ввода в процессе -по мере того, как шаблоны загружаются и записывают результат обратно в тот же tmpфайл в режиме добавления; см. объяснение по ссылке ниже:

Использование одного и того же имени файла для ввода в оболочке sub -, а также в качестве вывода в родительской оболочке будет конфликтовать?

2
18.03.2021, 22:49

Также можно использовать join.

join -t"/" -a1 -e " " -o '1.1,2.1,2.2' <(awk '{ print $1"/"}' Extension.txt ) <( awk '{ print $0}' Text.txt)
0
18.03.2021, 22:49

Теги

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