使用Bash对所有列进行排序?

时间:2014-03-22 18:49:10

标签: bash sorting io

我有一个输入文件(限制为2条记录,列数不受限制),例如:

6 5 9 4.5 
3 9 13 1

我想使用bash排序脚本来排序文件中的每一列并产生输出:

3 5 9 1
6 9 13 4.5

这样做的目的是我想比较并提取每列中最大的。

我想对所有列进行排序,然后只打印出文件的最后一条记录将是一个很好的解决方案,但是我找不到对每列进行排序的代码。只要没有达到EOF,bash就可以迭代'for循环',并对当前字段的每一列进行排序吗?

重要说明**可以有任意数量的列,但只有2个记录。 **

3 个答案:

答案 0 :(得分:0)

假设您的所有号码都在名为text的文件中,如下所示

6 5 9 4.5
3 9 13 1

如果每个数字都由一个空格分隔,您可以这样做..

#array of all the numbers in the first line of text
num=($(head -n 1 text))

#array for each resulting line
row1=()
row2=()

#iterate num length times
for (( i=1; i<=${#num[@]}; ++i )); do

    #cut the ith column from the file and sort it
    col=($(cat text | cut -d ' ' -f$i | sort -n))

    #split column into its respective rows
    row1+=( ${col[0]} )
    row2+=( ${col[1]} )
done

#write results out to file
echo ${row1[@]} >> sorted_text
echo ${row2[@]} >> sorted_text

这将导致名为sorted_text的文件看起来像这样

3 5 9 1
6 9 13 4.5

如果您只想要具有最大数字的行,请从输出中删除row1

答案 1 :(得分:0)

  

这样做的目的是我想比较并提取每列中最大的。

在这种情况下,假设输入文件被称为data

# Read the two lines into arrays:
{ read line1 ; read line2 ; } <data     
line1=($line1)
line2=($line2)
# Compare the two lines, finding the max for each column
out=
for ((i=0; i<${#line1[@]}; i++))
do
    max=${line1[$i]}
    [[ 1 = "$(echo "${line2[$i]} > ${line1[$i]}" | bc)" ]] && max=${line2[$i]}
    out="$out $max"
done
# Show results
echo $out

以上产生输出:

6 9 13 4.5

答案 2 :(得分:0)

我们可以使用这个命令

awk'{for(i = 1; i&lt; = NF; i ++); print}'| sort filename.txt