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 中做到这一点?任何帮助或指导将不胜感激
您可以在单个 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 扩展)。
最后
for(j=1;j<=NR;j++){
for(i=1;i<NF;i++){
printf "%s,",matrix[i][j]
}
print matrix[i][j]
}
Run Code Online (Sandbox Code Playgroud)为每一行打印a[1],
, a[2],
, ..., a[NF-1],
,的序列a[NF]\n
。