排序之分区排序——awk

涉及知识点:

1.当我们在对好几列数据进行一个排序的时候,我希望在第一列有序的情况下,对第二列进行排序,在保证第一列第二列有序的情况下,对第三列再进行排序,如下图所示:

排序之分区排序——awk_第1张图片

2.分区排列的思想就在于,我们要识别到区的start与end,并且在循环中设立跳跃条件,而分区算法的前提就在我们要先对第一列进行排序,只有这样,才能够开始进行后面的分区排列。

以下为代码:

BEGIN{
#初始化
file_name="data-2.txt"   #数据所在的txt
sort_number_1=2          #要进行排序的列数
sort_number_2=3
sort_number_3=4

#——————————————————————————————
#代码块【1】
#作用:为了把文件内数据存入数组
#获取文件的总行数     all_NR_number
for(i=1;i<=1000;i++)
{
  "cat "file_name" |awk '{print NR}'"|getline
  all_NR_number=$0
}

#获取文件的总列数     all_NF_number
for(i=1;i<=1000;i++)
{
  "cat "file_name" |awk '{print NF}'"|getline
  all_NF_number=$0
}



#——————————————————————————————
#代码块【2】
#作用:为了将数据的每一块都存到二维数组conten_arry[]中
for(i=1;i<=all_NR_number;i++)
{ 
 for(j=1;j<=all_NF_number;j++)
 {
   "grep "i"_code "file_name"|awk '{print $'"j"'}'"|getline 
   arry[i][j]=$0
   printf arry[i][j]"   "
 }
 printf "\n"
}
printf"*****************数据存入数组完成*************************\n"



#——————————————————————————————
#代码块【3】
#作用:开始对第一列进行排序,分区排列函数,是要针对于第一列有序才可以进行,这里用了通用的简单排序
bar1=1
if(bar1==1){
print"**********************************开始第一部分排序*****************************************"
for(i=1;i<=all_NR_number-1;i++)
{
  k=i
  change_number=0
#k总是指向最小编号的下标
#sort_number_1为第一部分要排序的所在列
  for(j=i+1;j<=all_NR_number;j++)
  {
      if(arry[k][sort_number_1]>arry[j][sort_number_1])
      {
         k=j
         change_number++  
      }       
  }
  if(change_number>0)
  {
       for(l=1;l<=all_NF_number;l++)
       {
         temp_number=arry[i][l]
         arry[i][l]=arry[k][l]
         arry[k][l]=temp_number
       }
  }
}
for(i=1;i<=all_NR_number;i++)
{
 for(j=1;j<=all_NF_number;j++)
 {
   printf arry[i][j]"   "
 }
 printf"\n"
}
print"***************************对第一部分排序结束********************"
}


#——————————————————————————————————
#代码块【4】
#作用:开始使用分区排列函数,不改变第一列有序的情况下,对第二列需要排序的进行排序
print"**************************开始对第二部分进行排序**********************************"
subarea(sort_number_1,sort_number_2,all_NR_number,all_NF_number)#这里就是调用了自定义的函数
#当我们传入前部有序的列数后,后面的列数就会根据前面的来进行分区排序
for(i=1;i<=all_NR_number;i++)
{ 
 for(j=1;j<=all_NF_number;j++)
 { 
   printf arry[i][j]"   "
 }
 printf"\n"
}
print"**************************对第二部分完成排序********************************"
}


#——————————————————————————————————
#代码块【5】
#作用:开始使用分区排列函数,不改变第二列有序的情况下,对第三列需要排序的进行排序
print"**************************开始对第三部分进行排序**********************************"
subarea(sort_number_2,sort_number_3,all_NR_number,all_NF_number)
for(i=1;i<=all_NR_number;i++)
{
 for(j=1;j<=all_NF_number;j++)
 {
   printf arry[i][j]"   "
 }
 printf"\n"
}
print"**************************对第三部分完成排序********************************"
}




#分区排序算法函数主体
function  subarea(sort_number_first,sort_number_second,all_NR_number,all_NF_number,i,j,k,l,a,b){
count=0
for(a=1;a<=all_NR_number-1;a=count+a)
{
  for(b=a;b<=all_NR_number;b++)
  {
    if(arry[a][sort_number_first]==arry[b][sort_number_first])
    {
      count++
      continue
    }
    if(arry[a][sort_number_first]!=arry[b][sort_number_first])
    {
      end=b-1
      start=a
      for(i=start;iarry[j][sort_number_second])
          {
             k=j
             change_long++
          }
        }
        if(change_long > 0)
        {
           for(l=1;l<=all_NR_number;l++)
           {
             temp_number=arry[i][l]
             arry[i][l]=arry[k][l]
             arry[k][l]=temp_number
           }
        }      
       }
       break
     }
   }
   return
}
}

最终实现的效果:

排序之分区排序——awk_第2张图片

 

你可能感兴趣的:(排序算法,算法)