我正在尝试对文件进行排序:
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
不知道您没有告诉它的任何结构,因此它不知道应该按前几个字符对行进行分组。因此,您最终会得到完全排序的最后一列,这意味着混淆了表名称。