我在尝试用呆子进行排序时遇到了麻烦。我目前有:
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
PROCINFO["sorted_in"]="@ind_str_asc"
- 按数组键/索引进行比较/排序。我们可以设置预定义的数组PROCINFO
为一组预定义值中的一个。这里描述的那些特殊值(文档):https://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Scanning
输出:
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
命令将从第二个开始输出所有以空格分隔的字段。