排除 cat / ls 结果中的重复项

Excluding duplicates in cat / ls result

我在一个文件中有数百行具有相同的结尾。

我的锻炼(结果相同):

$ cat x.txt | sort -u
$ cat x.txt | sort -u | uniq -u
$ cat x.txt | sort -u | awk '!a[[=10=]]++'

media_w2089898193_b1344100_sleng_2437.ts
media_w2089898193_b1344100_sleng_2438.ts
media_w2089898193_b1344100_sleng_2439.ts
media_w2089898193_b1344100_sleng_2440.ts
media_w950159543_b1344100_sleng_2439.ts
media_w950159543_b1344100_sleng_2440.ts
media_w950159543_b1344100_sleng_2441.ts
..........so on and on.................

我希望结果变成这样:

media_w2089898193_b1344100_sleng_2437.ts
media_w2089898193_b1344100_sleng_2438.ts
media_w2089898193_b1344100_sleng_2439.ts
media_w2089898193_b1344100_sleng_2440.ts
media_w950159543_b1344100_sleng_2441.ts
..........so on and on.................

您需要用 4 位数字索引数组,因此:

cat x.txt | sort -u | awk -F [\._] '{ if (a[]=="") { a[]=[=10=] } } END { PROCINFO["sorted_in"]="@ind_num_asc";for (i in a) { print a[i] } }'

设置。和_作为字段分隔符,然后建立一个数组a,以第5个分隔符(4位代码)为索引,行为值。最后,按数组索引顺序排序并打印数组的每个值。

使用这个 Perl 单行代码:

perl -ne '/.*(\d+)/; print if !$seen{}++;' in_file

Perl 单行代码使用这些命令行标志:
-e : 告诉 Perl 查找内联代码,而不是在文件中。
-n :一次循环输入一行,默认分配给 $_

/.*(\d+)/ : 捕获到 </code> 1 个或多个数字的最后一段。<br /> <code>print if !$seen{}++; :仅打印每个捕获的数字段的第一次出现。

另请参见:
perldoc perlrun: how to execute the Perl interpreter: command line switches
perldoc perlrequick: Perl regular expressions quick start