我正在使用Linux shell脚本为movielens数据创建5倍交叉验证。任何人都可以向我解释一下:
sort -k 1,1n
是什么意思?我知道这意味着从专栏1
开始,到1n
结束,但1n
是什么意思?****::****::***
,也就是说,分隔符为::
,但不是" ::"也" ::"适用于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 :(得分:0)
sort -k 1,1n
表示对第一个字段进行排序(仅限)并进行数字排序。
排序-t
期望单个字符分隔字段。因此,您必须做以下两件事之一:
::
对之间的空字段。::
分隔符替换为其他字符。使用:
是否安全是值得商榷的;这取决于您的数据是否可以自己拥有:
。你可以使用一个控制字符,例如FS
(字段分隔符,控制 - \ ,0x1C,八进制034),它有一定程度的信心,它不会出现在你的正常情况中数据。可以使用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