Проблемы с использованием awk для удаления строки с указанным значением c в определенном столбце - PullRequest
2 голосов
/ 29 апреля 2020

У меня есть файл data.anno, состоящий из 6677 строк и 33 столбцов. Например, на первом изображении вы можете увидеть некоторые строки файла data.anno.

2953 строк содержат «присутствует» в 10-м столбце. Я хочу получить новый файл, подобный оригиналу, но без строк, содержащих «присутствует» в 10-м столбце. Я пытался с этим:

awk '$10!="present"' data.anno >> data_output.anno

, но я столкнулся с проблемой: полученный файл вывода по-прежнему содержит две строки с «настоящим» в 3-м столбце, в то время как другие 2951 строки, содержащие «присутствует» «в 10-м столбце правильно исчезли. У вас есть идеи, почему это происходит? Как вы думаете, есть ли лучший способ получить нужный мне выходной файл?

Во втором изображении вы видите две строки, содержащие «присутствует», которые все еще присутствуют в выходном файле после использования awk. На третьем изображении вы можете увидеть некоторые из 2951 строк, содержащих «настоящее», которые правильно исчезли после использования awk.

some of the rows of the data.anno file

rows containing

some of the 2951 rows containing

1 Ответ

1 голос
/ 30 апреля 2020

Ваш реальный входной файл , который содержит страны в 13-м столбце, разделен табуляцией и имеет некоторые поля, содержащие пробелы, поэтому вам нужно установить FS в таб:

awk -F'\t' '$13 != "Italy" file

иначе строки с полями до $ 13, содержащие пробелы, будут обрабатываться как несколько полей, и тогда Италия не будет в 13-м поле, а в 14-м или позже.

Вот что происходит с использованием более представительный образец входного файла с разделенными табуляцией полями (cat -T предназначен только для отображения вкладок):

$ cat file
ID      DAY     LOCALITY        OTHER
1       the weekend     Italy   stuff
2       mon     England stuff
3       wed     Italy   stuff
4       the weekend     Italy   stuff
5       sun     England stuff
6       thu     Italy   stuff

$ cat -T file
ID^IDAY^ILOCALITY^IOTHER
1^Ithe weekend^IItaly^Istuff
2^Imon^IEngland^Istuff
3^Iwed^IItaly^Istuff
4^Ithe weekend^IItaly^Istuff
5^Isun^IEngland^Istuff
6^Ithu^IItaly^Istuff

$ awk '$3!="Italy"' file
ID      DAY     LOCALITY        OTHER
1       the weekend     Italy   stuff
2       mon     England stuff
4       the weekend     Italy   stuff
5       sun     England stuff

$ awk -F'\t' '$3!="Italy"' file
ID      DAY     LOCALITY        OTHER
2       mon     England stuff
5       sun     England stuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...