从数字表

时间:2015-10-10 08:34:44

标签: bash

我不确定是否有人已经问过这个问题,如果有人已经原谅我了。

我有一大块随机数(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

然而,显然他们每个人只排序第一列,其余的仍然是随机分散的。

我的想法是按行排序然后按列更改吗?修复我的代码或新代码的帮助将受到高度赞赏。感谢

1 个答案:

答案 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

上述情况并不十分困难,因为输入可以逐行处理。

对每列中的值进行排序要困难得多。 一种方法:

  1. 转置值
  2. 逐行应用排序逻辑(问题的第一部分)
  3. 转置值
  4. 实现转置的一种方法:

    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