2016-08-22 67 views
2

我有一个看起来像巴什 - 删除重复维持秩序

1254543534523233434 
3453453454323233434 
2342342343223233535 
0909909092324243535 

有没有在bash的方式/命令删除上面的文件,基于特定字符串复制一个文件,而无需改变它们的顺序输出?

(含子 - > $ {行:11:8}

1254543534523233434 
2342342343223233535 
0909909092324243535 

我知道:

sort -u : sorts them numerically, then removes duplicates 
sort -kx,x -u : The same 
cat filein | uniq : requires them to be sorted already or it will not work 

余米试图找出是否有一个本地linux解决方案无需解析perl代码就可以了。提前致谢。

+0

这不是一个确切的重复。它具有额外的限制,仅根据子字符串比较行,但打印完整行。 但是,[答案](http://stackoverflow.com/questions/1444406/how-can-i-delete-duplicate-lines-in-a-file-in-unix)应该很容易扩展到'awk' ![substr($ 0,11,8)] ++'file.txt'。 –

回答

3

你可以不使用awk需要排序:

awk '!uniq[substr($0, 12, 8)]++' file 

1254543534523233434 
2342342343223233535 
0909909092324243535 
  • 由于AWK指数从1开始,你需要使用substr($0, 12, 8),从而获得所需8个字符的文本从第12位出发。
  • uniq是一个关联数组,其子字符串使用substr函数进行检索。
  • ++套阵列的值作为1
+1

这工作完美,谢谢。 – onlyf