使用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 oft
。这解释了很多。谢谢@EtanReisner:很好的观点-现在数字有了意义(长度到第一个t
);有一点相关的注意事项:在使用UTF-8语言环境的OSX(从10.9.2开始)上,当心awk
的length()
函数:它计算多字节字符的字节数。个别地;e、 例如,awk'{print length($0)}您的计数问题在于字段分隔符。您需要引用参数-F'\t'
。正如所写的那样,awk使用了FS oft
。这解释了很多。谢谢@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