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

У меня есть некоторые табличные данные, которые выглядят следующим образом.

1f2edc31defc588a369544ac32215afec2ae65da  2019-01-08
e95c31b76be6b99eb8a0670b93b91c9e9abf2efb  2018-11-27
c2dd1d6be6434b6ef109fa0394546fa500501efe  2018-11-27
c6b6b534addff919150d94276f61eb8d0882f3f6  2018-09-04
459a495a929cffa2205d31c6cc7ba2750af2580b  2018-06-25
11f7883b29295e39bc964522deb96132d6a2803e  2018-06-25
73a2a72ee9d0a9acf0ed02b0959f3fb5a44c3fc7  2018-06-25
0970c0fef779a4ea89638140f339c2047d10d0c5  2017-12-29

Мне нужно удалить строки из таблицы, чтобы во втором столбце (дате) не дублировалось значение - должно остаться только первое вхождение.

Я некоторое время не использовал Perl, но после пары поисков в Google, чтобы напомнить себе о правильном синтаксисе, я смог придумать этот однострочный.

$ perl -e '%seen = (); for (<>) { @v = split(/\s+/); unless (exists($seen{$v[1]})) { $seen{$v[1]} = 1; print } }' < data.tsv > data.clean.tsv

После быстрого взгляда это, кажется, делает трюк, но это беспорядок. Есть ли более понятный и лаконичный способ сделать это с помощью переносимых команд оболочки (UNIX), или же любое решение будет включать в себя беспорядок Perl / sed / awk / и т. Д.?

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Не нужно быть грязным

perl -ne'print unless $exists{(split)[1]}++' dup_data.txt
0 голосов
/ 11 января 2019

Поскольку data.tsv уже отсортировано в поле 2nd , более простой метод, не требуется perl:

uniq -f 1 data.tsv > data.clean.tsv

Вывод (содержимое data.clean.tsv ):

1f2edc31defc588a369544ac32215afec2ae65da  2019-01-08
e95c31b76be6b99eb8a0670b93b91c9e9abf2efb  2018-11-27
c6b6b534addff919150d94276f61eb8d0882f3f6  2018-09-04
459a495a929cffa2205d31c6cc7ba2750af2580b  2018-06-25
0970c0fef779a4ea89638140f339c2047d10d0c5  2017-12-29
0 голосов
/ 11 января 2019

Perl предвидел подобные проблемы и предложил краткие решения:

perl -ane 'print unless $seen{$F[1]}++' < data.csv > data.clean.csv

См. perlrun для получения информации о переключателях -a и -n.

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

$ perl -MO=Deparse -ane 'print unless $seen{$F[1]}++' 
LINE: while (defined($_ = <ARGV>)) {
    our(@F) = split(' ', $_, 0);
    print $_ unless $seen{$F[1]}++;
}
-e syntax OK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...