我不确定是否有人已经问过这个问题,如果有人已经原谅我了。
我有一大块随机数(my_number)
1 2 5 8 3 4
3 7 5 4 7 2
2 3 7 7 9 1
我想按行和列对它们进行排序:
按行
1 2 3 4 5 8
2 3 4 5 7 7
1 2 3 7 7 9
按列
1 2 5 4 3 1
2 3 5 7 7 2
3 7 7 8 9 4
到目前为止,我已经尝试了
while read line; do
tr, $'\n' < <(printf -- "%s" "$line") | sort -g | tr $ '\n', | sed 's/,$/\n/';
done < my_number
我还尝试了一些像
这样的基本命令sort -g my_number
sort -n my_number
然而,显然他们每个人只排序第一列,其余的仍然是随机分散的。
我的想法是按行排序然后按列更改吗?修复我的代码或新代码的帮助将受到高度赞赏。感谢
答案 0 :(得分:1)
来自:
1 2 5 8 3 4
3 7 5 4 7 2
2 3 7 7 9 1
到此:
1 2 3 4 5 8
2 3 4 5 7 7
1 2 3 7 7 9
通过纠正原来的尝试,并不是非常困难:
while read line; do
tr ' ' $'\n' <<< $line | sort -g | tr '\n' , | sed 's/,/ /g'
done < the_file
上述情况并不十分困难,因为输入可以逐行处理。
对每列中的值进行排序要困难得多。 一种方法:
实现转置的一种方法:
transpose() {
gawk '{ for (i = 1; i <= NF; ++i) a[i] = a[i] " " $i } END {for (i in a) { print substr(a[i], 2); print "" }}'
}
为清楚起见,我们也将排序逻辑放在一个函数中:
sort_each_row() {
while read line; do
tr ' ' $'\n' <<< $line | sort -g | tr '\n' , | sed 's/,/ /g'
done
}
然后你可以这样做:
transpose < the_file | sort_by_row | transpose