排序但忽略排序中的某些模式?

时间:2017-08-25 18:32:53

标签: bash sorting

我这样做

sort -f -t , -k 2,2 file -o file

我有什么方法可以忽略某些模式,例如“ABC”,所以我得到了这个

Dog
ABCFrog
Lion

或者这个

DogFrog
DogABCLion
DogZebra

我如何使用它以及我希望它做什么的示例。

http://randomUrl.com/icon.png, Dog ABC (C) http://AnotherUrl.com
http://randomUrl.com/icon.png, Dog (A) http://AnotherUrl.com
http://randomUrl.com/icon.png, Dog (B) http://AnotherUrl.com

http://randomUrl.com/icon.png, Dog (A) http://AnotherUrl.com
http://randomUrl.com/icon.png, Dog (B) http://AnotherUrl.com
http://randomUrl.com/icon.png, Dog ABC (C) http://AnotherUrl.com

我希望在排序时跳过/忽略“ABC”。

谢谢, 克里斯

1 个答案:

答案 0 :(得分:1)

有趣的问题。我认为解决这个问题最方便的方法是暂时删除有问题的模式,排序,然后恢复它们。

实现此目的的一种方法是从每个字符串中删除模式,但也在分隔符后的同一行中包含原始字符串,以便sort对第一个无模式版本进行操作,但原始字符串版本保留在同一行。然后删除无模式版本:

sed 's/\(.*\)\( ABC \)\?\(.*\)/\1 \3\t&/' file |
   sort -f -t , -k 2,2 |
   cut -f2

示例输入:

url1, Dog ABC (C) url2
url1, Dog (A) url2
url1, Dog (B) url2

sed输出:

url1, Dog (C) url2  url1, Dog ABC (C) url2
url1, Dog (A) url2  url1, Dog (A) url2
url1, Dog (B) url2  url1, Dog (B) url2

sort输出:

url1, Dog (A) url2  url1, Dog (A) url2
url1, Dog (B) url2  url1, Dog (B) url2
url1, Dog (C) url2  url1, Dog ABC (C) url2

cut输出:

url1, Dog (A) url2
url1, Dog (B) url2
url1, Dog ABC (C) url2