Unix 多列排序问题

Unix 多列排序问题

我正在尝试对文件进行排序:

TX001;A0004|Number|5|0|Y|1        
TX001;A0110|VARCHAR|5|0|Y|4         
TX001;A1332|VARCHAR|15|0|Y|3         
TX001;B3321|VARCHAR|15|0|Y|5         
TX001;C1321|VARCHAR|15|0|Y|2      
TY001;A1234|Number|5|0|Y|3        
TY001;C2335|VARCHAR|5|0|Y|1        
TY001;B2133|VARCHAR|15|0|Y|2        
TZ001;A1234|Number|5|0|Y|3    
TZ001;A2133|VARCHAR|5|0|Y|1  
TZ001;C0133|VARCHAR|15|0|Y|2

预期输出结果为:

TX001;A0004|Number|5|0|Y|1   
TX001;C1321|VARCHAR|15|0|Y|2   
TX001;A1332|VARCHAR|15|0|Y|3  
TX001;A0110|VARCHAR|5|0|Y|4  
TX001;B3321|VARCHAR|15|0|Y|5  
TY001;C2335|VARCHAR|5|0|Y|1  
TY001;B2133|VARCHAR|15|0|Y|2  
TY001;A1234|Number|5|0|Y|3  
TZ001;A2133|VARCHAR|5|0|Y|1      
TZ001;C0133|VARCHAR|15|0|Y|2  
TZ001;A1234|Number|5|0|Y|3

我需要根据最后一个数字列进行排序。当我尝试使用排序时-n,第一列的顺序正在改变。

尝试使用sort -t "|" -k 6,6n FNAM.txt,但它会导致数字排序改变第一列顺序。

我需要根据最后一列进行数字排序,保持表名的第一列不受影响。

答案1

与任何符合 POSIX 标准 sort:

sort -t"|" -k1,1.6 -k6n file
  • -t"|"将分隔符设置为|.
  • -k1,1.6对第一个字段从开头到第 6 个字符进行排序1
  • -k6n然后对第 6 个字段进行数字排序。

1从联机帮助页:

POS is F[.C][OPTS], where F is the field number and C the character position in the field;

答案2

sort可以对不同类型的多个列进行排序,但它要求分隔符是单个字符。要处理您的示例并产生预期的输出,您可以替换第一个 ';'与“|”,然后按字母数字顺序对第一列进行排序,然后按数字顺序对第七列(以前是第六列)进行排序,最后替换第一个“|”和 ';':

sed 's/;/|/' < FNAM.txt | sort -t\| -k1,1 -k7,7n | sed 's/|/;/'

你尝试过的变体,

sort -t "|" -k 6,6n FNAM.txt

仅在第六列上对完整文件进行数字排序;sort不知道您没有告诉它的任何结构,因此它不知道应该按前几个字符对行进行分组。因此,您最终会得到完全排序的最后一列,这意味着混淆了表名称。

相关内容