2017-04-19 89 views
1

我有一个文件,它的分隔符是“|||”。如何使用linux shell排序使用多字符分隔符对文件进行排序?

abc|||123|||999|||5|||Just for you | Jim|||20 
cef|||7|||210|||6|||Go away | R&B|||30 
mmm|||89|||320|||16|||Traveling Light|George Winston|||21 

定界符“|||”不能用“|”代替或“||”,因为数据本身可能包含“|”或“||”。

有人能告诉我如何使用分隔符“|||”对第2列进行排序吗? ?

以下方法失败:

sort -t$'|||' -nrk2 a.txt > b.txt 
sort: multi-character tab `|||' 

谢谢!

+0

你可以交换柱,然后用'排序-n'整个文件没有指定一个分隔符 – m13r

+0

@ M13R你的方法不起作用。上面的a.txt只是一个简单的例子。真正的文件包含许多数字列,我必须对至少2个数字列进行排序,就像sort -t $'|||' -nrk2 -k3,rn -k4,rn a.txt> b.txt –

+0

当你说失败时会发生什么? 'sort'运行失败,还是只会产生不正确的输出?如果运行失败,你会得到什么错误信息?如果输出不正确,你会得到什么输出?显示你得到的输出的例子,以及你的期望。 –

回答

0

你可以分隔符更改为|排序它sort然后改变一切回:

# change | to __BAR__ writing the result to b.txt 
sed '[email protected]\([^|]\)|\([^|]\)@\1__BAR__\[email protected]' a.txt > b.txt 
# change ||| to | in b.txt 
sed -i '[email protected]|||@|@g' b.txt 

# do sorting with | delimiter writing the result to c.txt 
sort -t$'|' -nrk2 -k3,rn -k4,rn b.txt > c.txt 

# change everything back in c.txt: 
# | to ||| 
sed -i '[email protected]|@|||@g' c.txt 
# __BAR__ to | 
sed -i '[email protected][email protected]|@g' c.txt 
相关问题