使用 awk 单独对文件中的每一列进行数字排序

Gil*_*les 4 awk text-processing numeric-data

我正在尝试对一个非常大的文件中的每一列进行数字排序。我需要命令速度很快,所以我尝试在 awk 命令中执行此操作。

示例输入:

1,4,2,7,4
9,2,1,1,1
3,9,9,2,2
5,7,7,8,8
Run Code Online (Sandbox Code Playgroud)

示例输出:

1,2,1,1,1
3,4,2,2,2
5,7,7,7,4
9,9,9,8,8
Run Code Online (Sandbox Code Playgroud)

我做了一些可以完成这项工作的东西(但它不是我需要的强大的 awk 命令):

for i in $(seq $NumberOfColumns); do 
  SortedMatrix=$(paste <(echo "$SortedMatrix") <(awk -F ',' -v x=$i '{print $x}' File | sort -nr) -d ,)
done
Run Code Online (Sandbox Code Playgroud)

但它很慢!
我试过在 awk 中做到这一点,我想我很接近:

SortedMatrix=$(awk -F ',' 'NR==FNR {for (i=1;i<=NF;i++) print|"sort -nr"}' File)
Run Code Online (Sandbox Code Playgroud)

但它不输出列(只是一个很长的列),我明白为什么这样做但我不知道如何解决它,我想在 awk 中使用 paste 但我不知道如何实现它。

有谁知道如何在 awk 中做到这一点?任何帮助或指导将不胜感激

Qua*_*odo 7

您可以在单个 GNU awk 中完成:

gawk -F ',' '
    {
        for(i=1;i<=NF;i++){matrix[i][NR]=$i}
    }
    END{
        for(i=1;i<=NF;i++){asort(matrix[i])}
        for(j=1;j<=NR;j++){
            for(i=1;i<NF;i++){
                printf "%s,",matrix[i][j]
            }
            print matrix[i][j]
        }
    }
' file
Run Code Online (Sandbox Code Playgroud)
  • for(i=1;i<=NF;i++){matrix[i][NR]=$i}

多维数组(GNU 扩展)matrix被填充,因此matrix[i][j]包含 column i、 row的数量j

  • for(i=1;i<=NF;i++){asort(matrix[i])}

对每一列进行排序(GNU 扩展)。

为每一行打印a[1],, a[2],, ..., a[NF-1],,的序列a[NF]\n