如何使用awk按长度排序?

时间:2015-12-21 17:58:02

标签: sorting awk

我有以下Python脚本,用于按行长度排序:

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

如何在Awk中编写相同的脚本?

3 个答案:

答案 0 :(得分: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 :(得分:1)

使用awk with sort几乎肯定比以下解决方案更好,但是它只使用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] }
  }'

答案 2 :(得分: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提升到行数更高的数字)
  • 因为行被加载到内存中,所以shell sort是大文件的更好选项,即使它创建了一个新的分叉子shell。

我接受@fedorqui的建议,将NR用作数组中的索引而不是专用变量