2015-12-21 97 views
2

我有以下Python脚本,我用长给行排序:如何使用awk按行数排序行?

import fileinput 
print "".join(sorted(fileinput.input(), key=len)) 

我怎样写在awk中相同的脚本?

+3

你想要一个纯粹的'awk'的解决方案,或者是一个班轮在* NIX命令使用最终目标是什么? “awk”的大多数用法往往是单行使用面向行的输入和输出,这种排序违反了; 'awk'可以进行排序,但大部分时间你可以让'sort'工具完成工作,然后用'awk'处理结果。还有,awk的味道? ['gawk'提供'asort'](https://www.gnu.org/software/gawk/manual/html_node/Array-Sorting-Functions.html#Array-Sorting-Functions),但根据这些文档,功能不规范;其他版本需要从头开始编写排序。 – ShadowRanger

+0

@ShadowRanger哇我没有想到所有的错综复杂。有一个单线但不是必需的,这将是很好的。 – Ana

回答

1

一对夫妇使用awksort的解决方案:

# keep spaces 
awk 'OFS = "\t" { print length, $0 }' file | sort -g | cut -f2- 

# stripping out spaces from line before counting 
awk 'OFS = "\t" { gsub (" ", "", $0); print length, $0 }' file | sort -g | cut -f2- 
1

用awk与排序比下面的解决方案,但是它只能使用GNU AWK几乎肯定会更好,并说明了如何使用一个用户的定义比较:

gawk ' 
    function clength(i1, v1, i2, v2) { return length(v1) - length(v2); } 
    {a[++i] = $0;} 
    END { asort(a, aclone, "clength"); 
    for (i=1;i<=length(a);i++) { print aclone[i] } 
    }' 
1

利用GNU AWK(由于功能asorti):

awk '{O[NR]=$0;L[length*1000+NR]=NR}END{asorti(L,S);for(s in S)print O[L[S[s]]]}' fileinput 
  • 我这里假设没有超过1000线(如果有更多的,只是提高1000到数行数的更高)
  • 因为线加载到内存中,外壳sort是一个更好的选择即使它创建了一个新的分叉子shell,也是如此。

我拿@fedorqui的建议在阵列中使用的NR为指标,而不是专用的可变

+1

好的!请注意,您也可以依靠行号并说'O [NR] = $ 0'。 – fedorqui

+1

对,还好,我修改了帖子 – NeronLeVelu