使用awk按字段长度排序。。。不起作用

使用awk按字段长度排序。。。不起作用,awk,Awk,我有一个制表符分隔的文件,我需要按第一个字段的长度排序。我找到了一条适合我的线的样本,但它给出了非常奇怪的结果: awk -F\t '{print length($1) " " $0|"sort -rn"}' SpanishGlossary.utf8 | sed 's/^.[^>]*>/>/' > test.tmp 。。。给出以下内容(几个有代表性的示例--这是一个很长的文件): 前导数字应该是第一个字段的长度,但显然不是。我不知道这算什么 我做错了什么?谢谢。试试这个

我有一个制表符分隔的文件,我需要按第一个字段的长度排序。我找到了一条适合我的线的样本,但它给出了非常奇怪的结果:

awk -F\t '{print length($1) " " $0|"sort -rn"}' SpanishGlossary.utf8 | sed 's/^.[^>]*>/>/' > test.tmp
。。。给出以下内容(几个有代表性的示例--这是一个很长的文件):

前导数字应该是第一个字段的长度,但显然不是。我不知道这算什么

我做错了什么?谢谢。

试试这个:

awk '$0=length($1) FS $0' file | sort -nr | sed -r 's/^\S*\s//'
测试:

这里我使用空格(默认)作为awk的
FS
,如果您需要
选项卡
,请添加
-F'\t'

编辑 为@Jaypal添加一个awk(gnu awk)和一个衬垫

我提到了gawk,因为它有asort和asorti,我们可以使用它们进行排序

我还更改了输入文件,添加了一些相同长度的(
$1
)行

更好的
“@val_num_asc”
desc
asorti(a,b,“…”)

试试这个:

awk '$0=length($1) FS $0' file | sort -nr | sed -r 's/^\S*\s//'
测试:

这里我使用空格(默认)作为awk的
FS
,如果您需要
选项卡
,请添加
-F'\t'

编辑 为@Jaypal添加一个awk(gnu awk)和一个衬垫

我提到了gawk,因为它有asort和asorti,我们可以使用它们进行排序

我还更改了输入文件,添加了一些相同长度的(
$1
)行

更好的
“@val_num_asc”
desc
asorti(a,b,“…”)


+1代替sed,我将编写
cut-d'-f2-
删除第一个字段。@glennjackman有没有办法在
awk
中进行数字排序。我在
awk
中编写了一个解决上述问题的解决方案,遇到了一个问题,字符串的长度是13,最后才打印出来,因为13听起来像是一个完美的堆栈溢出问题@jaypal没有注意到你的新评论,我只是在回答中添加了一个仅适用于awk(gawk)的解决方案。在电话中,但如果一个字符串超过10个字符,它是否有效?+1代替sed,我会编写
cut-d''-f2-
来删除第一个字段。@Glenjackman有没有办法在
awk
中进行数字排序。我在
awk
中编写了一个解决上述问题的解决方案,遇到了一个问题,字符串的长度是13,最后才打印出来,因为13听起来像是一个完美的堆栈溢出问题@jaypal没有注意到你的新评论,我只是在回答中添加了一个仅适用于awk(gawk)的解决方案。在电话中,但如果一个字符串超过10个字符,它是否有效?你的计数问题在于字段分隔符。您需要引用参数
-F'\t'
。正如所写的那样,awk使用了FS of
t
。这解释了很多。谢谢@EtanReisner:很好的观点-现在数字有了意义(长度到第一个
t
);有一点相关的注意事项:在使用UTF-8语言环境的OSX(从10.9.2开始)上,当心
awk
length()
函数:它计算多字节字符的字节数。个别地;e、 例如,
awk'{print length($0)}您的计数问题在于字段分隔符。您需要引用参数
-F'\t'
。正如所写的那样,awk使用了FS of
t
。这解释了很多。谢谢@EtanReisner:很好的观点-现在数字有了意义(长度到第一个
t
);有一点相关的注意事项:在使用UTF-8语言环境的OSX(从10.9.2开始)上,当心
awk
length()
函数:它计算多字节字符的字节数。个别地;e、 例如,
awk'{打印长度($0)}'
kent$  cat f
as foo
a foo
aaa foo
aaaaa foo
aaaa foo

kent$  awk '$0=length($1) FS $0' f|sort -nr|sed -r 's/^\S*\s//'
aaaaa foo
aaaa foo
aaa foo
as foo
a foo
kent$  cat f
as foo
a foo
aaa foo
ccc foo
aaaaa foo
bbbbb foo
aaaa foo

kent$  awk '{a[length($1)"."NR]=$0}END{asorti(a,b);for(i=NR;i>0;i--)print a[b[i]]}' f
bbbbb foo
aaaaa foo
aaaa foo
ccc foo
aaa foo
as foo
a foo