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



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

我的训练(相同结果(:

$ cat x.txt | sort -u
$ cat x.txt | sort -u | uniq -u
$ cat x.txt | sort -u | awk '!a[$0]++'
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[$5]=="") { a[$5]=$0 } } END { PROCINFO["sorted_in"]="@ind_num_asc";for (i in a) { print a[i] } }'

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

使用这个Perl单行:

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

Perl单行使用以下命令行标志:
-e:neneneba告诉Perl在线查找代码,而不是在文件中查找代码
-n:一次循环输入一行,默认情况下将其分配给$_

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

另请参阅:
perldoc perlrun:如何执行Perl解释器:命令行开关
perldoc perlrequick:Perl正则表达式快速启动

最新更新