代码之家  ›  专栏  ›  技术社区  ›  Tedee12345

AWK将行号添加到日期

awk
  •  1
  • Tedee12345  · 技术社区  · 3 月前

    我有一个输入文件。

    A
    B
    C
    

    我使用一个给出结果的命令。

    awk -v date="$(date +%d-%m-%Y --date="$NR day")" '{print $0, date}' File_1
    
    A 16-02-2025
    B 16-02-2025
    C 16-02-2025
    

    我想得到结果。

    A 16-02-2025
    B 17-02-2025
    C 18-02-2025
    
    4 回复  |  直到 3 月前
        1
  •  4
  •   Gilles Quénot ticktalk    3 月前

    我会怎么做:

    $ awk '{printf "%s ", $0; system("date +%d-%m-%Y -d "NR"\\ day")}' File_1
    A 16-02-2025
    B 17-02-2025
    C 18-02-2025
    

    当你这样做时:

    -v date="$(date +%d-%m-%Y --date="$NR day")"
    

    变量只分配一次。

        2
  •  4
  •   Gilles Quénot ticktalk    3 月前

    @Gilles答案的变体 getline

    awk '{ "date +%d-%m-%Y --date=\""NR" day\""|getline theDate; print $0, theDate }' File_1 
    A 16-02-2025
    B 17-02-2025
    C 18-02-2025
    
        3
  •  2
  •   markp-fuso    3 月前

    如果你的口味 awk (例如, GNU awk , mawk )支持 mktime() / strftime() 可以执行日期计算的函数( +1 day )里面 awk 消除重复操作系统/系统的开销 date 电话:

    awk -v date_in="$(date '+%d-%m-%Y' --date="$NR day")" '
    
    function fmt_date() { return strftime("%d-%m-%Y", epoch) }       # convert epoch (seconds) to desired format
    
    BEGIN { split(date_in,dt,"-")
            epoch = mktime(dt[3] " " dt[2] " " dt[1] " 12 00 00")    # generate initial epoch (seconds); use 12:00:00 (noon)
                                                                     # to eliminate any issues around daylight savings
          }
    
          { print $0, fmt_date()
            epoch += 86400                                           # +1 day
          }
    
    ' File_1
    

    笔记:

    • 我们也可以拉 $(date '+%d-%m-%Y' --date="$NR day") 进入 awk 脚本,OP只需要提供 NR 作为输入参数;这个 systime() 然后,函数将派上用场,作为允许 awk 获取“当前时间”的脚本;如果OP选择尝试这个,但在让它工作时遇到问题,那么我建议问一个新问题
    • 看见 GNU awk - Time Functions 有关的详细信息 mktime() / strftime() / systime() 功能

    试驾(今天= 15 Feb 2025 ):

    ######## NR=-3
    
    A 12-02-2025
    B 13-02-2025
    C 14-02-2025
    
    ######## NR=0
    
    A 15-02-2025
    B 16-02-2025
    C 17-02-2025
    
    ######## NR=1
    
    A 16-02-2025
    B 17-02-2025
    C 18-02-2025
    
    ######## NR=4
    
    A 19-02-2025
    B 20-02-2025
    C 21-02-2025
    
        4
  •  1
  •   Daweo    3 月前
    awk -v date="$(date +%d-%m-%Y --date="$NR day")" '{print $0, date}' File_1
    

    您不能在值内使用内置的GNU AWK变量进行值设置 -v 选项。它确实尝试拉取NR 变量,未找到任何值,这将导致执行

    date +%d-%m-%Y --date=" day"
    

    请注意,如果您分配NR 变量,它将使用例如。

    NR=100 && echo "$(date +%d-%m-%Y --date="$NR day")"
    

    它将在今天之后100天输出。

    如果你不需要使用 awk 无论价格如何,请考虑使用 bash 例如,通过执行以下操作,让 file.txt 内容为

    offset=0
    while read line
    do
       echo $line $(date +%d-%m-%Y --date="$offset day")
       offset=$((offset+1))
    done < file.txt
    

    给出输出(截至2025年2月15日)

    A 15-02-2025
    B 16-02-2025
    C 17-02-2025
    

    说明:我用 while 迭代以下行 file.txt 并在输出行后加上所需日期后每圈将偏移量增加1。