如何通过管道排序到 gawk?

如何通过管道排序到 gawk?

我在尝试用呆子进行排序时遇到了麻烦。我目前有:

gawk -f p3a01.awk unsortedNames.txt | sort | gawk -f p3a01.awk

然而,这给了我错误的结果。如果我做类似的事情,gawk 似乎工作得很好:

gawk -f p3a01.awk unsortedNames.txt | sort > test1.out
gawk -f p3a01.awk test1.out

我不确定是否有正确的方法可以直接通过管道排序到 gawk。我理想地希望在一条线上完成这一切

片段unsortedNames.txt

Faye King
Lenny R Graph
I M Board
Grey White

p3a01.awk (首先打印姓氏,然后打印姓名的其余部分):

BEGIN{}
{
      printf $NF " ";
      $NF="";
      print $0;
}
END{}

p3a02.awk(按姓氏排序后按原始顺序打印文件):

BEGIN{}
{
     for(i=2;i<=NF;i++){
         printf $i " ";
     }
     print $1;
}
END{}

最终结果(按姓氏排序):

I M Board
Lenny R Graph
Faye King
Grey White

答案1

优化单一处理的GNUawk解决方案:

awk 'BEGIN{ PROCINFO["sorted_in"]="@ind_str_asc" }
     { a[$NF]=$0 }END{ for(i in a) print a[i] }' unsortedNames.txt


输出:

I M Board
Lenny R Graph
Faye King
Grey White

答案2

\r您的代码似乎按照广告的方式工作,因此您遇到的任何错误都可能与输入数据中的不可见字符(在行尾?)有关。

我注意到你是去除转换数据时的最后一个字段sort。这是没有必要的。您只需在每行前面添加最后一个字段,然后在以下内容之后再次将其删除sort

$ awk '{ print $NF, $0 }' file | sort | cut -d ' ' -f 2-
I M Board
Lenny R Graph
Faye King
Grey White

cut命令将从第二个开始输出所有以空格分隔的字段。

相关内容