2017-04-19 92 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 
相關問題