如何用AWK根据第一列最后重复行将第三列值输出到第四列
需求与解决方案
输入文件
30.01.2025 47288.39 47288.39 30.01.2025 -1.00 47287.39 31.01.2025 50.00 47337.39 31.01.2025 -1600.00 45737.39 31.01.2025 1880.00 47617.39 31.01.2025 18.21 47635.60 31.01.2025 -3.46 47632.14 03.02.2025 -51.00 47581.14 03.02.2025 -10.00 47571.14 04.02.2025 -1600.00 45971.14 04.02.2025 1609.00 47580.14 05.02.2025 -800.00 46780.14 05.02.2025 -320.00 46460.14 05.02.2025 51.00 46511.14 05.02.2025 800.00 47311.14 05.02.2025 11.00 47322.14
期望输出
对每个日期(第一列)的最后一行,在末尾追加该行的第三列值作为第四列,输出如下:
30.01.2025 47288.39 47288.39 30.01.2025 -1.00 47287.39 47287.39 31.01.2025 50.00 47337.39 31.01.2025 -1600.00 45737.39 31.01.2025 1880.00 47617.39 31.01.2025 18.21 47635.60 31.01.2025 -3.46 47632.14 47632.14 03.02.2025 -51.00 47581.14 03.02.2025 -10.00 47571.14 47571.14 04.02.2025 -1600.00 45971.14 04.02.2025 1609.00 47580.14 47580.14 05.02.2025 -800.00 46780.14 05.02.2025 -320.00 46460.14 05.02.2025 51.00 46511.14 05.02.2025 800.00 47311.14 05.02.2025 11.00 47322.14 47322.14
尝试过的无效命令
awk '{if(!seen[$1]++){print $0}}' File_1
正确的AWK解决方案
采用两次遍历的方式,先统计每个日期的行数,再处理每行判断是否为该日期的最后一行:
NR == FNR { count[$1]++; next } { printf "%-12s %-12s %-12s", $1, $2, $3 if (++current[$1] == count[$1]) { printf " %s", $3 } print "" }
执行方式
可以将上述代码保存为脚本文件执行:
awk -f script.awk File_1 File_1
也可以直接写成单行命令:
awk 'NR == FNR {count[$1]++; next} {printf "%-12s %-12s %-12s", $1, $2, $3; if(++current[$1]==count[$1]) printf " %s", $3; print ""}' File_1 File_1
逻辑说明
- 第一次遍历(
NR == FNR):统计每个日期在文件中出现的总次数,存入数组count。 - 第二次遍历:
- 用
printf格式化输出前三个字段,保证和期望输出的对齐格式一致。 - 用数组
current记录当前日期已处理的行数,当行数等于该日期的总次数时,判定为最后一行,追加输出第三列的值。 - 最后换行完成该行输出。
- 用
内容的提问来源于stack exchange,提问作者Tedee12345
相关产品推荐
相关产品推荐

