У меня есть следующий список:
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000022 0
NM_000023 0
NM_000024 8
NM_000025 0
NM_000026 0
И у меня есть другой файл только с первым столбцом:
NM_000031
NM_000032
NM_000033
NM_000034
NM_000022
NM_000035
NM_000036
NM_000037
NM_000023
NM_000038
NM_000039
NM_000040
NM_000041
NM_000042
Я хочу удалить целые строки первого файла, которые называют как второе. В этом случае выходной файл будет:
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000024 8
NM_000025 0
NM_000026 0
(удаляющий NM_000022 и NM_00023 с его соответствующими значениями)
Спасибо!!
С awk
:
awk 'NR==FNR {a[$0]; next}; {if ($1 in a) next}; 1' f1.txt f2.txt
Введите файл только с отдельным столбцом как первый аргумент и тот для проверки на (первый столбец) членство как второй аргумент.
NR==FNR {a[$0]; next}
, здесь NR==FNR
только будет верно для первого файла, затем мы сохраняем каждую строку в массив a
так, чтобы мы могли сделать тест членства для первого аргумента второго файла, затем мы идем в следующую строку без дальнейшей операции на втором файле
{if ($1 in a) next}; 1
будет выполняться только для второго файла, тот для проверки, здесь мы проверяем, отделился ли пробел, первый аргумент находится в массиве a
, если существующий затем движение к следующей строке, иначе печатающей целую строку.
Пример:
$ cat f1.txt
NM_000031
NM_000032
NM_000033
NM_000034
NM_000022
NM_000035
NM_000036
NM_000037
NM_000023
NM_000038
NM_000039
NM_000040
NM_000041
NM_000042
$ cat f2.txt
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000022 0
NM_000023 0
NM_000024 8
NM_000025 0
NM_000026 0
$ awk 'NR==FNR {a[$0]; next}; {if ($1 in a) next}; 1' f1.txt f2.txt
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000024 8
NM_000025 0
NM_000026 0
Можно также использовать sed
с циклом Bash.
Эта команда изменяет file1
на месте (создающий резервное копирование file1.bak
), удаляя каждую строку, которая запускается с любой строки от file2
:
while read line ; do sed -i.bak "/$line.*/d" file1 ; done < file2
Как с командой 'grep' здесь:)
grep -Fvf oneColumnedFile listFile > outfile