2016-12-19 2 views
3

у меня есть 2 текстовый файл и хотите удалитель строки в файле А, которые содержат строки в файле BУдалить все строки в файле А, которые содержат строки в файле B

файл A:

joe  ball  1335 
john dyer  1365 
dylan fisher 1795 
ian  gill  1913 
eric kelly 1101 

файл B:

1795 
1913 

И я хочу Баш код получить результат:

joe  ball  1335 
john dyer  1365 
eric kelly 1101 

Я стараюсь это коды, но ответ не получилось

$ grep -vwF -f A B 
$ awk -F'[ ,]' 'FNR==NR{a[$1];next} !($4 in a)' 

ответ

5
awk 'NR==FNR{a[$1];next} !($3 in a)' fileB fileA 

Он использует пространство в качестве разделителя полей, и $1 является первым колонком элементом линии, $3 является третьим столбцом элементом из линия. использование массив a магазин файлB элементы a[$1]. проверяет 3-й элемент столбца FiLea ли в массиве a, если не печатать всю линию Выход:

joe  ball  1335 
john dyer  1365 
eric kelly 1101 
+1

Вы можете даже не увеличивать 'a [$ 1]', просто 'a [$ 1]; next' будет достаточным. Кстати,'! ($ 3 in a) 'демонстрирует классный идиоматический способ использования awk. +1 – sjsam

+1

@sjsam согласен, я отредактирую его – haifzhan

+0

Tanx Haifeng Zhang – pedram

0

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

$ grep -v -f B A 
joe  ball  1335 
john dyer  1365 
eric kelly 1101 

То есть в самый простой, но будет создавать коллизии в условиях , Если вы калечить B немного с, например sed первым (добавить пространство для начала и $ до конца строки поиска):

$ sed 's/$/$/;s/^/ /' B 
1795$ 
1913$ 

и использовать его в процессе замещения:

$ grep -v -f <(sed 's/$/$/;s/^/ /' B) A 
joe  ball  1335 
john dyer  1365 
eric kelly 1101 
-1

кошка file_B | при чтении значений; do grep $ values ​​file_A >> newfile; done

+0

так много ошибок в таком маленьком коде ... UUOC, отсутствует настройка IFS, отсутствует аргумент чтения, некорректированная переменная, совпадающая по всей строке вместо желаемого поля , добавляя к файлу в цикле вместо того, чтобы писать ему один раз за пределами цикла, и [используя цикл оболочки для манипулирования текстом] (http://unix.stackexchange.com/questions/169716/why-is-using-a -оболочка-петля-процесс-текст-рассмотренного-плохо-практика). –

+0

нет erors, нет. он работает и отвечает на вопрос. ваша ссылка также не имеет отношения. – RJJ

+0

UUOC не только имеет свою собственную аббревиатуру, она имеет собственную веб-страницу, поэтому вы находитесь в меньшинстве, думая о своем прекрасном. Вы можете добавить еще 20 бесполезных команд (например, 'awk '1' | tr 'a' 'a' | sed 's/x/x' | ...') без проблем, но это не повод для этого. Ссылка, которую я предоставил, чрезвычайно актуальна, вы должны действительно перечитать ее, пока не поймете все ее точки и не зададите вопросы, если вы не понимаете их. Людям предлагается предоставить простые, минимальные примеры, которые демонстрируют их проблему - YMMV с допущением, что то, что они публикуют, является полной степенью их реального ввода/проблемы. –