Как выборочно удалить дублирующиеся строки в соответствии с определенным значением столбца? - PullRequest
0 голосов
/ 09 апреля 2019

Я зеленый горошек в редактировании текста в командной строке (например, awk и grep). У меня есть массив таблиц, и я хочу удалить строки в соответствии со значениями в столбце 4. Я хочу удалить все строки, содержащие значение 1 в столбцах 4, за которым следует то же значение в следующей строке.

А вот список данных,

k141    4797    2466    1
k141    4797    2466    2
k141    23474   11850   1
k141    27428   13800   1
k141    31736   15974   1
k141    35202   17751   1
k141    35202   17751   2
k141    35202   17751   3
k141    35202   17751   4
k141    35202   17751   5
k141    35202   17751   6
k141    35202   17751   7
k141    35202   17751   8
k141    35202   17751   9
k141    46266   23337   1
k141    54599   27445   1
k141    56753   28564   1
k141    56753   28564   2
k141    63661   32007   1
k141    71561   35988   1
k141    71561   35988   2
k141    72661   36561   1
k141    73579   37039   1
k141    84106   42358   1
k141    87251   43930   1
k141    88405   44516   1
k141    88405   44516   2
k141    88405   44516   3
k141    88405   44516   4
k141    89270   44939   1
k141    89270   44939   2
k141    89270   44939   3
k141    89270   44939   4
k141    93137   46825   1
k141    97378   48980   1
k141    97378   48980   2

Мой ожидаемый результат:

k141    4797    2466    1
k141    4797    2466    2
k141    35202   17751   1
k141    35202   17751   2
k141    35202   17751   3
k141    35202   17751   4
k141    35202   17751   5
k141    35202   17751   6
k141    35202   17751   7
k141    35202   17751   8
k141    35202   17751   9
(removal here)
k141    56753   28564   1
k141    56753   28564   2
(removal here)
k141    71561   35988   1
k141    71561   35988   2
(removal here)
k141    88405   44516   1
k141    88405   44516   2
k141    88405   44516   3
k141    88405   44516   4
k141    89270   44939   1
k141    89270   44939   2
k141    89270   44939   3
k141    89270   44939   4
(removal here)
k141    97378   48980   1
k141    97378   48980   2

Большинство методов онлайн удаляют все следующие строки со значениями в столбце 4, равными 1, например, awk !($4 in a){a[$4]++; next} $4 in a file

Так что я буду благодарен, если кто-нибудь может дать предложения о том, как этого можно достичь.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Использование uniq, man uniq:

NAME
       uniq - report or omit repeated lines

       -f, --skip-fields=N
              avoid comparing the first N fields

Использование uniq. uniq выберет первое дублированное значение:

$ cat foo
1 1
2 2
3 2
4 3
$ uniq -f 1 foo
1 1
2 2
4 3

и, очевидно, вам нужен последний, поэтому нам нужно использовать tac (man tac: объединять и печатать файлы в обратном порядке ) с uniq:

$ tac file | uniq -f 3 | tac
k141    4797    2466    1
k141    4797    2466    2
k141    35202   17751   1
k141    35202   17751   2
0 голосов
/ 09 апреля 2019

Это должно сделать это:

awk '$4=="1"{o=$0;next;}{if(o)print o;o=0}1' file.txt

Как это работает?

Сформируйте дубликаты, напечатайте последний дубликат, напечатайте все остальные строки.

$4=="1" { o=$0; next;}

ЕСЛИ столбец 4 РАВЕН 1 ТО присваивает всю строку переменной o И читает следующую строку. (Это в основном производит дубликаты, сохраняя последний в o.)

{if(o)print o;o=0}

Для строк, которые не соответствуют указанному выше условию, выведите переменную o (последний дубликат) и сбросьте o, чтобы повторить этот процесс.

1

печать текущей строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...