awk可以按照一定的顺序输出,但是如果是指定排序输出就比较困难。

考虑了一个方法。

做个范例的文件

cat t.txt
b 2
a 1
c 3
e 5
d 4

比如说按照a b c d e 排序,只是为了看着方便,不一定是按照英文顺序。

定义排序的列

LIST='a b c d e'

awk的例子

awk '{A[$1]=$2}END{split("'"${LIST}"'",B)
for(i in B)print A[B[i]]}' t.txt

END前面:{A[$1]=$2},使用awk里的关联数组,形成

A["a"]=1;A["b"]=2;...

这样的关联数组,END后面

split("'"${LIST}"'",B)

${LIST}是awk外面shell定义的变量,导入awk,必须用双引号+单引号+双引号,第一个双引号是split函数需要对字符串引起了,单引号是为了把awk切断,把外界变量LIST塞进去,里面的双引号是为了不让外界变量LIST散开,把有多个空格内容的变量,形成单一的值传入,不加awk会报错。split是awk里把字符串变成数组的一个函数,就是把外界的LIST变量,变换成awk的B[@]数组。后面的for语句其实是for(i=1;i in B;i++)的简化形式,一般看到的是for(i=1;i<=lengh(B);i++)这样,效果相同,就是给i赋值数组B的索引值,因为数组B不是关联数组,所以这样的输出一定是按照B数组的从低到高的顺序输出。关于如何让关联数组也排序,参照我以前的文章《awk数组排序 PROCINFO["sorted_in"]》。最后用数组嵌套打印,因为B数组一定是按照外界变量LIST的顺序输出,用B数组去调用关联数组A,就实现用变量LIST的顺序,输出A数组。