Linux shell和sort -t和-k

时间:2015-10-13 18:50:35

标签: linux shell sorting

我正在使用Linux shell脚本为movielens数据创建5倍交叉验证。任何人都可以向我解释一下:

  1. sort -k 1,1n是什么意思?我知道这意味着从专栏1开始,到1n结束,但1n是什么意思?
  2. 我的数据类似于****::****::***,也就是说,分隔符为::,但不是" ::"也" ::"适用于sort -t选项。你能告诉我将::设置为分隔符的正确方法是什么? (sort -t " "表示分隔符是空格;这是有效的,但我的文件分隔符不是空格。)
  3. 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
    

1 个答案:

答案 0 :(得分:0)

sort -k 1,1n表示对第一个字段进行排序(仅限)并进行数字排序。

排序-t期望单个字符分隔字段。因此,您必须做以下两件事之一:

  1. 计算每个::对之间的空字段。
  2. 对数据进行处理,以便::分隔符替换为其他字符。使用:是否安全是值得商榷的;这取决于您的数据是否可以自己拥有:。你可以使用一个控制字符,例如FS(字段分隔符,控制 - \ ,0x1C,八进制034),它有一定程度的信心,它不会出现在你的正常情况中数据。
  3. 可以使用Bash(使用ANSI C quoting)和sed完成Munging(和unmunging):

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