我有一个输入文件(限制为2条记录,列数不受限制),例如:
6 5 9 4.5
3 9 13 1
我想使用bash排序脚本来排序文件中的每一列并产生输出:
3 5 9 1
6 9 13 4.5
这样做的目的是我想比较并提取每列中最大的。
我想对所有列进行排序,然后只打印出文件的最后一条记录将是一个很好的解决方案,但是我找不到对每列进行排序的代码。只要没有达到EOF,bash就可以迭代'for循环',并对当前字段的每一列进行排序吗?
重要说明**可以有任意数量的列,但只有2个记录。 **
答案 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