【发布时间】:2016-01-28 23:40:24
【问题描述】:
您好,我有一个包含以下行的文件:
apple
12
orange
4
rice
16
如何使用 bash 按数字排序? 假设每个数字是上述对象的价格。
我希望它们的格式如下:
12 apple
4 orange
16 rice
或
apple 12
orange 4
rice 16
谢谢
【问题讨论】:
标签: linux bash command-line
您好,我有一个包含以下行的文件:
apple
12
orange
4
rice
16
如何使用 bash 按数字排序? 假设每个数字是上述对象的价格。
我希望它们的格式如下:
12 apple
4 orange
16 rice
或
apple 12
orange 4
rice 16
谢谢
【问题讨论】:
标签: linux bash command-line
一个解决方案,使用paste + sort 让每个产品按价格排序:
$ paste - - < file|sort -k 2nr
rice 16
apple 12
orange 4
说明
来自paste男人:
写出由顺序对应的行组成的行 每个 FILE,由 TAB 分隔,输出到标准输出。 没有文件,或 当 FILE 为 - 时,读取标准输入。
paste 获取来自stdin 的流(你的 <file)并计算出每一行属于到虚构 归档由 - 表示,所以我们使用 - - 得到 两个 列
sort 使用标志-k 2nr 得到paste 输出按倒数顺序按第二列排序。
【讨论】:
你可以使用 awk:
awk '!(NR%2){printf "%s %s\n" ,$0 ,p}{p=$0}' inputfile
(略微改编自this answer)
如果你想在之后对输出进行排序,你可以使用sort(非常合乎逻辑):
awk '!(NR%2){printf "%s %s\n" ,$0 ,p}{p=$0}' inputfile | sort -n
这将给出:
4 orange
12 apple
16 rice
【讨论】:
使用awk的另一种解决方案
$ awk '/[0-9]+/{print prev, $0; next} {prev=$0}' input
apple 12
orange 4
rice 16
【讨论】:
while read -r line1 && read -r line2;do
printf '%s %s\n' "$line1" "$line2"
done < input_file
如果您希望按价格对行进行排序,请将结果通过管道传输到sort -k2:
while read -r line1 && read -r line2;do
printf '%s %s\n' "$line1" "$line2"
done < input_file | sort -k2
【讨论】: