Bash - Awk sort -n not sorting


awk '{for(i=1; i<=NF; i++) printf("%d ",$i)}' | sort -n

它读取像

这样的文件
55 89 33 20

并正常打印出来,而不是按数字排序。为什么?

sort以每行为基础工作,printf默认不附加换行符,您需要指定它。所以使用:

awk '{for(i=1; i<=NF; i++) printf("%dn",$i)}' | sort -n

这将在单独的行上打印你的数字,如果你想让它们再次在一行中,那么你可以将它管道到paste:

awk '{for(i=1; i<=NF; i++) printf("%dn",$i)}' | sort -n | paste -s -d ' '

你也可以只使用print而不是printf,这将在默认情况下附加换行符:

awk '{for(i=1; i<=NF; i++) print $i}' | sort -n

如果您想将所有数字保持在一行但对它们进行排序,您也可以在awk本身中进行排序。

$ awk '{split($0,f,FS); n=asort(f); 
     for (i=1; i<=n; ++i) printf("%d ", f[i]); printf "n"}' <<<'55 89 33 20'
20 33 55 89

但是这开始进入我转而使用Perl的领域,只是因为它在shell提示符下编写的程序更短:

$ perl -lane 'print join " ",sort @F' <<<'55 89 33 20'
20 33 55 89

Awk在很多情况下更具表现力,但数组操作不是其中之一。

Ruby也很短,如果你喜欢一种比Perl更流行的语言:):

$ ruby -lane 'puts $F.sort.join " "' <<<'55 89 33 20'
20 33 55 89

即使不是为一行代码构建的Python,在这种情况下也比Awk的代码少(但括号的数量相同):

$ python -c 'print " ".join(sorted(raw_input().split()))' <<<'55 89 33 20'
20 33 55 89

没有awk的解决方案:

cat file | sed 's/ /n/g' | sort -n | paste -s -d ' '

按照示例设置文件:

echo "55 89 33 20" > file.txt

下面的命令将输出您想要的内容:

awk '{for(i=1; i<=NF; i++) print($i)}' file.txt | sort -n
20
33
55
89

注意print每次将打印一个新的行字符。
另外,请注意文件名应该作为参数传递给awk

最新更新