Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不带分隔符的列上的unix排序_Unix_Sorting - Fatal编程技术网

不带分隔符的列上的unix排序

不带分隔符的列上的unix排序,unix,sorting,Unix,Sorting,我想根据特定列使用Unix脚本对文件内容进行排序: 例如:在第3列对以下文件进行排序: ax5aa aa3ya fg7ds pp0dd aa1bb 将导致 pp0dd aa1bb aa3ya ax5aa fg7ds 我尝试了sort-k3,3,但它只是在单词的3d组上排序(separator=SPACE) 有没有办法让unix排序按我喜欢的方式进行,或者我应该使用其他工具?在排序之前使用sed创建列 $ echo "ax5aa aa3ya fg7ds pp0dd aa1bb"

我想根据特定列使用Unix脚本对文件内容进行排序:

例如:在第3列对以下文件进行排序:

ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb
将导致

pp0dd
aa1bb
aa3ya
ax5aa
fg7ds
我尝试了sort-k3,3,但它只是在单词的3d组上排序(separator=SPACE)


有没有办法让unix排序按我喜欢的方式进行,或者我应该使用其他工具?

在排序之前使用sed创建列

$ echo "ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb" | sed 's/\(.\)/\1 /g' | sort -t ' ' -k3,3 | tr -d ' '

pp0dd
aa1bb
aa3ya
ax5aa
fg7ds

我将直接使用perl并定义一个比较器

echo $content | perl -e 'print sort {substr($a,3,1) cmp substr($b,3,1)} <>;'
echo$content | perl-e'打印排序{substr($a,3,1)cmp substr($b,3,1)};'
分类的手册页:

[……]

-k、 --key=POS1[,POS2]

在POS1(原点1)处开始关键点,在POS2处结束关键点(默认的行尾)

[……]

POS是F[.C][OPTS],其中F是字段编号,C是字段中的字符位置;两者都是原点1。如果-t和-b都无效,则字段中的字符从前面空白的开头开始计数。OPTS是一个或多个单字母排序选项,它覆盖该键的全局排序选项。如果未指定键,则使用整行作为键


使用--key=1.3,1.3,您说只有一个字段(整行),并且您正在比较该字段的第三个字符位置。

我会这样做:
echo-e'abc\nxyz\ncde'| perl-npe's/(.)/$1/g'| sort-k3,3 | perl-npe's//g'
echo $content | perl -e 'print sort {substr($a,3,1) cmp substr($b,3,1)} <>;'
$ sort --key=1.3,1.3 inputfile
pp0dd
aa1bb
aa3ya
ax5aa
fg7ds