Как удалить строки из файла при сравнении двух файлов

У меня есть два файла, мне нужен выходной файл, который содержит все, чего нет в первом файле, но есть во втором файле, второй файл содержит все, что есть в первом файле, с еще некоторыми записями. Я попытался:

for j in `cat first`; do sed '/"$j"/d' second; done
cat first 
a
b
c
d
e
f
# cat second
a
1
b
22
33
c
44
d
11
e
44
f

Используйте grep -vFxf first second

anubhava 17.05.2022 19:02
Шеллчек обнаружил несколько проблем с кодом в вопросе.
pjh 17.05.2022 20:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
51
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Комментарий @anubhava - отличный ответ.

С comm игнорируйте то, что уникально для первого, и игнорируйте то, что является общим

comm --nocheck-order -13 first second

Также есть простое решение .

ОБНОВЛЕНИЕ 1: ультра усеченная версия

mawk ' NR==FNR { __[$_] } NF -= $_ in __' FS='^$' 
                                          test_first_file.txt 
                                          test_second_file.txt
    1
    22
    33
    44
    11
    44

———————————————————————————————

[m/n/g]awk '
BEGIN { FS = "^$" } NR==1 { 
   do { __[$-_] } while ((getline)<=(FNR==NR))

} ($-_ in __)!=!___[$-_]-- ' test_first_file.txt test_second_file.txt

———————————————————————————————

1
22
33
44
11

Довольно излишне эзотерическая ИМО.

glenn jackman 17.05.2022 20:03

это только потому, что я не хотел, чтобы он распечатывал дубликаты. если это и nawk не беспокоят, то я мог бы обрезать его до mawk '^(FNR<NR) { __[$_] } _^($ in __)' FS='^$' test_first_file.txt test_second_file.txt

RARE Kpop Manifesto 17.05.2022 22:13

Массив __ может использовать «настоящее» имя переменной. Я никогда не видел $-_ -- что это? Вы относительно новичок в SO, вы обнаружите, что ответы «гольф» не особенно ценятся.

glenn jackman 17.05.2022 22:39

«_» никогда не определялся, поэтому это пустая строка — любая пустая строка оценивается как логическое значение false в awk, что означает числовой ноль, поэтому $_ — это просто $0. $-_ предназначен только для nawk, потому что он жалуется на пустое поле, поэтому $-_ просто заставляет его оценивать численно, "$-_" >>>> "$-0" >>>> $0. Вы можете сделать $+_, это то же самое. вы даже можете сделать $-OFMT или $+SUBSEP, и это даст вам 0 долларов. попробуй сам.

RARE Kpop Manifesto 17.05.2022 22:53

@glenn jackman: а чем отличается название [2]? он дает так же мало полезной информации, как __[ 2 ]

RARE Kpop Manifesto 17.05.2022 22:55

Вы должны думать о своей аудитории, когда даете ответы. Если кто-то спрашивает: «Как мне поступить (что-то, что эксперт считает очевидным)», то хвастовство кодом, выглядящим на х*й, вряд ли кому-то поможет.

glenn jackman 17.05.2022 22:59

@glenn jackman: и ты думаешь, что это помогает кому-то вообще, кормя их всем с ложки? если они хотят учиться, я более чем готов объяснить, но я здесь не для того, чтобы делать за них чью-то домашнюю работу

RARE Kpop Manifesto 17.05.2022 23:03

Так что минусуйте вопрос и идите дальше. Зачем вообще отвечать? Я ценю объяснение мне вопроса BTW.

glenn jackman 17.05.2022 23:09

Я предпочитаю ответ от @anubhava, он отлично подходит для написания сценариев. Однако, если вам просто нужна визуальная помощь, чтобы увидеть разницу между двумя файлами, старая добрая команда diff может вам очень помочь.

$  diff -y first second
a                               a
                                  > 1
b                               b
                                  > 22
                                  > 33
c                               c
                                  > 44
d                               d
                                  > 11
e                               e
                                  > 44
f                               f

-y или --side-by-side, вывод в два столбца.

Я тоже видел этот замечательный (полный кредит @Kent):

$ awk 'NR==FNR{a[$1]++;next;}!($0 in a)' first second
1
22
33
44
11
44

Есть еще такие команды:

  • colordiff - как diff, но с цветом
  • cmp - сравнивать файлы побайтно
  • vimdiff - сравнение с помощью редактора vim

Вероятно, есть много других отличных способов сделать это, это лишь некоторые из способов.

Да, это простое решение для awk.

glenn jackman 17.05.2022 22:41
Ответ принят как подходящий

Преобразование моего комментария в ответ, чтобы будущим посетителям было легко найти решение.

Вы можете использовать это grep:

grep -vFxf first second

1
22
33
44
11

Варианты:

  • -v: выбранные линии не соответствуют ни одному из указанных шаблонов.
  • -F: исправлен поиск строки
  • -x: точное совпадение
  • -f: Используйте файл для шаблонов

не знал, что grep можно использовать как comm! это замечательно

nntrn 17.05.2022 21:59

Другие вопросы по теме