У меня есть 2 файла с разделителями табуляции

A 2
A 5
B 4
B 5
C 10

А также

A 2
A 5
B 5

Я хочу удалить строки в file1, которые находятся в file2, так что вывод:

B 4
C 10

Я пытался:

awk 'NR==FNR{c[$1$2]++;next};!c[$1$2] > 0' file2 file1 > file3 

Но он удаляет больше строк, чем ожидалось.

1026997259 file1 
   1787919 file2 
1023608359 file3

Как я могу изменить этот код, чтобы:

У меня есть 2 файла с разделителями табуляции

A 2 3
A 5 4
B 4 5
B 5 5
C 10 12

А также

A 2 5
A 5 4
B 5 3 
F 6 7

Основываясь только на 1-м и 2-м столбцах, я хочу получить строки в файле file1, которые также находятся в файле file2, чтобы получить следующий результат:

B 5 5
C 10 12
1
Madza Yasodara Farias Virgens 21 Авг 2018 в 00:22

3 ответа

Лучший ответ

Подумайте об этом - если вы объедините ab c и a cb они оба станут abc, так что, по вашему мнению, ваш код делает с $1$2? Используйте SUBSEP по назначению ($1,$2) и измените !c[$1$2] > 0 на !(($1,$2) in c). Также подумайте, означает ли !c[$1$2] > 0 !(c[$1$2] > 0) или (!c[$1$2]) > 0. Я бы никогда не написал прежний код, так что наверняка, я всегда писал бы его с помощью паренов, так как я собирался его проанализировать. Ну действуй:

awk 'NR==FNR{c[$1,$2];next} !(($1,$2) in c)' file2 file1

Или просто используйте $0 вместо $1,$2:

awk 'NR==FNR{c[$0];next} !($0 in c)' file2 file1
1
Ed Morton 20 Авг 2018 в 21:36

Если совпадающие строки в этих двух файлах идентичны, и эти два файла отсортированы в одном и том же порядке, то comm (1) может помочь:

comm -23 file1 file2

Он печатает строки, которые есть только в первом файле (если не указано -1), строки, которые есть только во втором файле (если не -2), и строки, которые есть в обоих файлах (если {{ Х2 } } ) . Если оставить несколько включенных опций, они будут напечатаны в нескольких столбцах (разделенных табуляцией).

1
David Maze 21 Авг 2018 в 00:57

Почему бы не использовать команду grep?

grep -vf file2 file1
2
George Pavelka 20 Авг 2018 в 21:46
51938674