2015-10-13 56 views
0

我正在使用Linux shell腳本爲movielens數據創建5-fold交叉驗證。任何人都可以向我解釋什麼:Linux shell和sort -t和-k

  1. sort -k 1,1n是什麼意思?我知道這意味着從列1開始,並在1n結束,但1n是什麼意思?
  2. 我的數據就像****::****::***,也就是說,分隔符是::,但是「::」和「::」都不適用於sort -t選項。你能告訴我什麼是正確的方法來設置::作爲分隔符? (sort -t " "意味着,隔板爲空間;這個工程,但我的文件的分隔符不是空格。)
trap `rm -f tmp.$$; exit 1` 1 2 15 # trap begin to execute the cmd in the quote when it meet signal 1,2 and 15 
batch=200000 
totalTuple=1000000 
#$$ is the process id 
for i in 1 2 3 4 5 #five fold cross validation, train/test is one fold 
do 
    head -`expr $i \* ${batch}` u.data | tail -`expr ${batch}` > tmp.$$ # take the ith 1/5 block 
    # expr return the cmd result as string 
    sort -t"\:\:" -k 1,1n -k 2,2n tmp.$$ > u$i.test 
    #sort -k -k, --key=KEYDEF sort via a key; KEYDEF gives location and type 
    #sort -t, --field-separator=SEP 
    head -`expr \($i - 1 \) \* ${batch}` u.data > tmp.$$ 
    tail -`expr \(5 - $i \) \* ${batch}` u.data >> tmp.$$ 
    sort -t"\:\:" -k 1,1n -k 2,2n tmp.$$ > u$i.base 
done 
+0

'排序--help'有問題的答案。 – karakfa

回答

0

sort -k 1,1n排序現場一個(只)是指,做一個數字排序。

Sort -t需要單個字符來分隔字段。因此,您必須執行以下兩項操作之一:

  1. 計算每個::對之間的空字段。
  2. Munge數據,以便::分隔符被替換爲其他字符。是否安全使用:值得商榷;這取決於您的數據是否自己擁有:。您可以使用控制字符,例如FS(字段分隔符,Control- \,0x1C,八進制034),並具有一定的置信度,它不會出現在正常數據中。

改寫(munging)(和unmunging)可能與巴什來完成(使用ANSI C quoting)和sed

sed -e $'s/::/\x1C/g' tmp.$$ | 
sort -t $'\x1C' -k 1,1n -k 2,2n 
sed -e $'s/\x1C/::/g' > u$i.base 
+0

但排序-k 1,1n -k 2,2n表示對第1列和第2列進行排序,1n表示第1列的數字排序,2n表示第2列的數字排序? – sunxd