如何在 awk 打印命令中使用排序?

如何在 awk 打印命令中使用排序?

我正在编写的 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"}

相关内容