如何使用awk提取以第一字段为分组键的已排序文件的最后一组数据
问题原因
你编写的awk命令存在执行顺序逻辑错误:
- 原命令会先执行
a[NR]=$0将当前行存入数组,再判断当前行第一字段是否和上一组分组键p一致 - 当切换到新分组的第一行时,新分组的首行会先被存入数组,紧接着触发分组不一致的逻辑清空整个数组,导致新分组的首行丢失,最终输出就会少一行
修正后的命令
调整逻辑顺序,先判断分组是否切换,再存储当前行即可:
awk -F, 'p != $1 { delete a; p = $1 } { a[NR] = $0 } END { for(i=1; i<=NR; i++) if(i in a) print a[i] }'
如果需要严格保证输出顺序和原文件一致,避免awk哈希数组遍历顺序不稳定的问题,可以用下面的版本:
awk -F, '$1 != prev { n = 0; prev = $1 } { arr[++n] = $0 } END { for(i=1; i<=n; i++) print arr[i] }'
这个版本不需要判断数组下标是否存在,直接按存储顺序遍历输出即可,内存占用也更低。
内容的提问来源于stack exchange,提问作者stack0114106
相关产品推荐
相关产品推荐

