簡體   English   中英

Bash - Awk排序 - 不排序

[英]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("%d\n",$i)}' | sort -n

這將在單獨的行中打印出您的數字,如果您希望它們再次在一行中,那么您可以將其管道paste

awk '{for(i=1; i<=NF; i++) printf("%d\n",$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更具表現力,但陣列操作不是其中之一。

如果你喜歡一種比Perl更酷的語言,Ruby就差不多了:):

$ 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

根據您的示例設置文件:

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

沒有awk的解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM