我在一个文件中有数百行具有相同的结尾。
我的训练(相同结果(:
$ 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正则表达式快速启动