我正在编写的 awk 脚本中有几个命令:
print "Here are some players and their numbers, sorted by last name"
if(sum[x] > 500) {print x, $2}
输出:
Here are some players and their numbers, sorted by last name
Lebron James 23
Kevin Durant 35
Kobe Bryant 24
Blake Griffin 32
Dikembe Mutumbo 55
我如何使用sort
命令在我的 awk 脚本中仅对球员和他们的号码进行排序?
答案1
您可以添加| sort -k2
到您的命令中。这将根据第二列按字母顺序排序。
例子:
$ echo "Lebron James 23
Kevin Durant 35
Kobe Bryant 24
Blake Griffin 32
Dikembe Mutumbo 55" | sort -k2
结果是
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55
答案2
虽然我不推荐它(考虑到通过外部命令管道传输结果相对简单sort
),但你至少可以使用最新版本的 GNU awk(至少 4.0 IIRC)来执行此操作,如所述使用 gawk 对数组值和索引进行排序
假设您有关联数组中的数据,其中索引为,您可以按照以下方式实现它Firstname Lastname
。首先,您需要定义一个自定义比较函数来拆分索引,首先比较,Lastname
然后(作为决胜局)比较Firstname
,例如
function mycmp(ia, va, ib, vb, sa, sb) {
if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
if(sa[2] < sb[2]) return -1;
else if (sa[2] > sb[2]) return 1;
else {
# compare first names
if(sa[1] < sb[1]) return -1;
else if (sa[1] > sb[1]) return 1;
else return 0;
}
}
else return 0;
}
现在您可以使用PROCINFO["sorted_in"]
@zwets 在评论中提到的数组排序方法
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
把它放在一起
#!/usr/bin/gawk -f
function mycmp(ia, va, ib, vb, sa, sb) {
if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
if(sa[2] < sb[2]) return -1;
else if (sa[2] > sb[2]) return 1;
else {
# compare first names
if(sa[1] < sb[1]) return -1;
else if (sa[1] > sb[1]) return 1;
else return 0;
}
}
else return 0;
}
{
a[$1" "$2] = $3;
}
END {
PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];
}
测试:
$ ./namesort.awk yourfile
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55
在较低或较旧的 awk 版本中,最好的选择可能是存储按索引的数据Lastname Firstname
,按常规进行排序asorti
,然后在遍历数组以打印时拆分和交换索引的字段:
awk '
{a[$2" "$1]=$3}
END {
n=asorti(a,b); for (i=1;i<=n;i++) {split(b[i],s); print s[2], s[1], a[b[i]]}
}' yourfile
答案3
要sort
仅由空格分隔的第二个字段,请使用键-k2,2
:
... | sort -k2,2
默认按sort
字典顺序排序。
请注意,如果您没有提到排序键的最后一个字段,即如果您只是使用,-k2
那么您可能无法获得所需的结果,因为这将sort
根据所有领域从第二开始。
另请检查man sort
。
答案4
print "Here are some players and their numbers, sorted by last name"
if(sum[x] > 500) {print x, $2 | "sort -k2,2"}
要将输出排序到文件:
print "Here are some players and their numbers, sorted by last name"
if(sum[x] > 500) {print x, $2 | "sort -k2,2 > sortedFile"}