You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

逻辑说明

  1. 第一次遍历(NR == FNR):统计每个日期在文件中出现的总次数,存入数组count。
  2. 第二次遍历:
    • 用printf格式化输出前三个字段,保证和期望输出的对齐格式一致。
    • 用数组current记录当前日期已处理的行数,当行数等于该日期的总次数时,判定为最后一行,追加输出第三列的值。
    • 最后换行完成该行输出。

内容的提问来源于stack exchange,提问作者Tedee12345

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:27:03