как удалить повторяющиеся строки в awk - PullRequest
0 голосов
/ 12 декабря 2018

У меня большой текстовый файл, подобный этому примеру:

example:

chr1    109472560   109472561   -4732   CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1

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

chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1

Я пытаюсь сделать это в awk, используя следующую команду:

awk myfile.txt | uniq > uniq_file_name.txt

, но вывод пуст,ты знаешь как это исправить?

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

Показывает разницу между uniq, awk '!a[$0]++' и sort -u.

uniq: удаляет последовательные повторяющиеся строки, сохраняет порядок:

$ echo "b\nb\na\nb\nb" | uniq
b
a
b

awk !a[$0]++: удаляет все дубликаты, сохраняет порядок

$ echo "b\nb\na\nb\nb" | awk '!a[$0]++'
b
a

sort -u: удаляет все дубликаты и сортирует выходные данные

$ echo "b\nb\na\nb\nb" | sort -u
a
b
0 голосов
/ 12 декабря 2018

Ваша команда:

$ awk myfile.txt | uniq > uniq_file_name.txt

, а точнее эта часть:

$ awk myfile.txt

будет зависать, так как нет программы или сценария для выполнения awk.Минимум, что вам нужно сделать, чтобы напечатать все строки:

$ awk 1 myfile.txt

Но так как у вас не было сценария awk, я предполагаю, что вам не нужен awk, тогда просто используйте uniq (в зависимости от ваших потребностей, либо):

$ uniq myfile.txt
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1

или

$ sort myfile.txt | uniq

, который для этого входа будет производить тот же вывод.

Обновление :

Относительно обсуждения в комментариях о зачем сортировать : если повторные строки означает все дублированные записи в файле, используйте sort.Если это означает последовательных дублированных строк , то забудьте sort.

0 голосов
/ 12 декабря 2018

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

> cat user106.txt
chr1    109472560   109472561   -4732   CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1
> perl -ne ' print if $kv{$_}++ == 1 ' user106.txt
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
>

Для удаления повторяющихся строк

> echo "a\nb\nb\nb\nc\nc\nd\na" | perl -ne ' print if $prev ne $_ ; $prev=$_ ' -
a
b
c
d
a
>
0 голосов
/ 12 декабря 2018

РЕДАКТИРОВАТЬ: Так как hek2mgl sir упоминается в случае, если вам нужно удалить непрерывные похожие линии, попробуйте следующее.

Допустим, следующим является Input_file:

cat Input_file
chr1    109472560   109472561   -4732   CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109472560   109472561   -4732   CLCC1

Запустите следующий код:

awk 'prev!=$0;{prev=$0}'  Input_file

Вывод будет следующим:

chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109472560   109472561   -4732   CLCC1
chr1    109477498   109477499   206 CLCC1
chr1    109472560   109472561   -4732   CLCC1


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

awk '!a[$0]++'  Input_file

Добавьте > output_file к вышеприведенной команде, если вы хотите перенести вывод в отдельный файл.

Объяснение: Добавление объяснения для кода выше сейчас.Это только в целях пояснения для запуска кода только вышеупомянутого.

awk '
!a[$0]++      ##Checking condition here if current line is present in array a index or NOT, if not then increase its value by 1.
              ##So that next time it will make condition as FALSE, since we need to have only unique lines.
              ##awk works on method of condition and action, so if condition is TRUE it will do some action mentioned by programmer.
              ##Here I am not mentioning action so by default print of current line will happen, whenever condition is TRUE.
'  Input_file  ##mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...