【问题标题】:Add a date column in an existing CSV using awk使用 awk 在现有 CSV 中添加日期列
【发布时间】:2017-01-05 16:47:24
【问题描述】:

我有一个格式如下的 csv

header1,header2,header3
 data1, data2, data3
 data4, data5, data6

我想添加一个日期列,使 csv 看起来像这样

header1,header2,header3, date
 data1, data2, data3, 01/04/2017
 data4, data5, data6, 01/04/2017

我尝试了以下 awk 命令,但它也在标题行中添加了日期。我是 awk 的新手,不知道如何使用它

mydate=$(date)
awk -v d="$mydate" -F"," 'BEGIN { OFS = "," } {$4=d; print}' input.csv > output.csv

【问题讨论】:

    标签: csv awk


    【解决方案1】:

    你在寻找这样的东西吗?

    awk -v date="4/1/17" -F"," 'BEGIN { OFS = "," } NR==1 {print $0 " ,date"} NR>1 {$4=date; print}'
    

    NR 指记录数。像行号。 这些内置变量可能对您有用:http://www.thegeekstuff.com/2010/01/8-powerful-awk-built-in-variables-fs-ofs-rs-ors-nr-nf-filename-fnr/?ref=binfind.com/web

    【讨论】:

    • 我刚刚尝试了您的解决方案,它与我正在寻找的非常接近,但不是在最后添加新列,而是将日期附加到 csv 中的倒数第二列。跨度>
    • @AshutoshD 只需添加一个带有日期变量的新列。就像你所做的一样。 awk -v date="4/1/17" -F"," 'BEGIN { OFS = "," } NR==1 {print $0 " ,date"} NR>1 {$4=date; print}' 。那么它应该可以工作了。
    【解决方案2】:

    awk 中的另一个使用条件运算符:

    $ mydate="5/1/2017"
    $ awk -v OFS=", " -v d=$mydate '$0 = $0 OFS ( NR==1?"date":d )' file
    header1,header2,header3, date
     data1, data2, data3, 5/1/2017
     data4, data5, data6, 5/1/2017
    
    • OFS=", "FS 可能保持默认,因为不需要它
    • 日期进入d var
    • 隐式打印
    • 条件运算符在第一条记录上打印date 或在所有其他记录上打印d

    【讨论】:

    • awk -v OFS=", " -v d=$mydate '$0 = $0 OFS ( NR==1?"date":d )'(似乎缺少分配的d
    • @NeronLeVelu 是的。我是在早上 7 点之前写的,如果它是唯一缺少的东西,我会很惊讶......
    • 我发现内容(此处为 $0)可以在脚本的“模式”条件部分更改,并直接用作脚本的结果(在本例中为行)
    【解决方案3】:

    在这种情况下,sed 版本是一个替代方案

    mydate="6/1/2017";sed -e '1 s/$/,date/;b' -e "s/\$/,${mydate}/" YourFile
    

    sed 允许带有选项-i 的内联版本(无显式中间文件),这有时很有用

    【讨论】:

      猜你喜欢
      • 2020-06-01
      • 2023-02-05
      • 1970-01-01
      • 2018-03-09
      • 2016-09-10
      • 2022-07-07
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多