用于折叠表格数据以生成非冗余列的Shell命令

用于折叠表格数据以生成非冗余列的Shell命令,shell,perl,Shell,Perl,我有一些类似这样的表格数据 1f2edc31defc588a369544ac32215afec2ae65da 2019-01-08 e95c31b76be6b99eb8a0670b93b91c9e9abf2efb 2018-11-27 c2dd1d6be6434b6ef109fa0394546fa500501efe 2018-11-27 c6b6b534addff919150d94276f61eb8d0882f3f6 2018-09-04 459a495a929cffa2205d31c6

我有一些类似这样的表格数据

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了,但是经过几次谷歌搜索提醒自己正确的语法后,我终于想出了这一行

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

快速看了一眼后,这似乎起到了作用,但却一团糟。有没有一种更简洁的方法可以使用可移植(UNIX)shell命令来实现这一点,或者任何解决方案都会涉及到大量的Perl/sed/awk/等等?

Perl预见到了类似的问题,并提出了简洁的解决方案:

perl -ane 'print unless $seen{$F[1]}++' < data.csv > data.clean.csv
不必乱七八糟

perl -ne'print unless $exists{(split)[1]}++' dup_data.txt
由于data.tsv已在第2个字段中排序,因此不需要
perl
一种更简单的方法:

uniq -f 1 data.tsv > data.clean.tsv
输出,(data.clean.tsv的内容):


请包括所需的输出。使用
bash
与操作代码进行比较:
cmp
uniq -f 1 data.tsv > data.clean.tsv
1f2edc31defc588a369544ac32215afec2ae65da  2019-01-08
e95c31b76be6b99eb8a0670b93b91c9e9abf2efb  2018-11-27
c6b6b534addff919150d94276f61eb8d0882f3f6  2018-09-04
459a495a929cffa2205d31c6cc7ba2750af2580b  2018-06-25
0970c0fef779a4ea89638140f339c2047d10d0c5  2017-12-29