我有以下Python脚本,用于按行长度排序:
import fileinput
print "".join(sorted(fileinput.input(), key=len))
如何在Awk中编写相同的脚本?
答案 0 :(得分:1)
使用awk
和sort
的几种解决方案:
# 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
提升到行数更高的数字)sort
是大文件的更好选项,即使它创建了一个新的分叉子shell。我接受@fedorqui的建议,将NR用作数组中的索引而不是专用变量