在BASH脚本中使用'awk'将列添加到CSV文件末尾

23

如何使用变量中的字符串向CSV文件末尾添加列?

input.csv

2012-02-29,01:00:00,Manhattan,New York,234
2012-02-29,01:00:00,Manhattan,New York,843
2012-02-29,01:00:00,Manhattan,New York,472
2012-02-29,01:00:00,Manhattan,New York,516

output.csv

2012-02-29,01:00:00,Manhattan,New York,234,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhattan,New York,843,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhattan,New York,472,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhattan,New York,516,2012-02-29 16:13:00

awk.sh

#!/bin/bash

awk -F"," '{$6="2012-02-29 16:13:00" OFS $6; print}' input.csv > output.csv

我尝试在awk.sh中添加了字符串,但是除去了所有逗号分隔符,并将其添加到了结尾。

awk.sh 的结果

2012-02-29 01:00:00 Manhattan New York 234 2012-02-29 16:13:00
2012-02-29 01:00:00 Manhattan New York 843 2012-02-29 16:13:00
2012-02-29 01:00:00 Manhattan New York 472 2012-02-29 16:13:00
2012-02-29 01:00:00 Manhattan New York 516 2012-02-29 16:13:00

感谢任何帮助!

已更新的awk.sh

#!/bin/bash

GAWK="/bin/gawk"
TIMESTAMP=$(date +"%F %T")
ORIG_FILE="input.csv"
NEW_FILE="output.csv"

#Append 'Create' DateTimeStamp to CSV for MySQL logging
$GAWK -v d="$TIMESTAMP" -F"," 'BEGIN {OFS = ","} {$6=d; print}' $ORIG_FILE > $NEW_FILE
rm -f $ORIG_FILE

难道不是“曼哈顿”而不是“曼哈坦”吗? - Jonathan Leffler
可能是,我只是草率地打了个例子。 - SirOracle
4个回答

27

你可以在OFS(输出字段分隔符)后添加逗号:

awk -F"," 'BEGIN { OFS = "," } {$6="2012-02-29 16:13:00"; print}' input.csv > output.csv

输出:

2012-02-29,01:00:00,Manhatten,New York,234,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhatten,New York,843,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhatten,New York,472,2012-02-29 16:13:00
2012-02-29,01:00:00,Manhatten,New York,516,2012-02-29 16:13:00

编辑 回答 SirOracle 的评论:

来自 awk 手册页:

       -v var=val
       --assign var=val
              Assign the value val to the variable var, before execution of the program begins.  Such 
              variable values are available to the BEGIN block of an AWK program.

将日期赋值给一个 shell 变量,然后在 awk 中使用它:

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

谢谢@Birei。我不确定OFS是什么,但现在我明白了。尝试了你的代码,它很有效。 - SirOracle
你知道我怎么通过变量添加日期而不是硬编码的时间戳吗?我会把我的修改后的代码放在上面,以便更好地查看。 - SirOracle
1
@Birei,我发现你的代码很有用,我已经将你的脚本打包并上传为#sparrow插件,这样每个人都可以重复使用它-https://sparrowhub.org/info/csv-add-column - Alexey Melezhik
@Birei,干得好谢谢。 有人如何将引号包含在要插入的字符串中? 我想在.csv文件的第二列中添加字符串“2.4.0”(包括引号),但是下面的代码不起作用:awk -F"," 'BEGIN { OFS = "," } {$2="\"2.4.0"\"; print}' test.csv > output.csv - pkaramol
以下代码可以实现功能,但会将字符串 2.4.0 的最后一个点号删除:awk -F"," 'BEGIN { OFS = "," } {$2="\""2.4.0"\""; print}' test.csv > output.csv - pkaramol
@我们可以添加标题吗?我的数据有标题。我该如何处理它? - avinash

18

我会这样做:

awk '{ printf("%s,2012-02-29 16:13:00\n", $0); }' input.csv > output.csv
这样硬编码数值,但你的代码也是这样做的。或者你可以使用 "sed" 命令:
sed 's/$/,2012-02-29 16:13:00/' input.csv > output.csv

4
或:awk -v date="2012-02-29 16:13:00" -v OFS=, '{print $0,date}' 该命令使用awk程序,将变量“date”设置为“2012-02-29 16:13:00”,将输出字段分隔符设置为逗号“,”,并打印每行文本与变量“date”的组合。 - glenn jackman

4
您可以设置OFS(输出字段分隔符):
awk -F"," 'BEGIN { OFS = "," } ; {$6="2012-02-29 16:13:00" OFS $6; print}' input.csv >output.csv

这给了我:

2012-02-29,01:00:00,Manhatten,New York,234,2012-02-29 16:13:00,
2012-02-29,01:00:00,Manhatten,New York,843,2012-02-29 16:13:00,
2012-02-29,01:00:00,Manhatten,New York,472,2012-02-29 16:13:00,
2012-02-29,01:00:00,Manhatten,New York,516,2012-02-29 16:13:00,

感谢Jörg Beyer。我使用下面@Birei的示例删除了OFS $6,以摆脱尾随逗号。我只是在尝试弄清楚如何添加一个变量来代替硬编码的日期。我已经更新了上面的问题,并提供了一个示例。 - SirOracle

-1
如果有人想通过shell创建带有列名的csv文件: 其中第一个输入存储在变量from_time,to_time中。
例如:使用from_time和to_time作为列名插入两个时间戳及其相应的值-
代码-
FROM_TIME=2020-02-06T00:00:00
TO_TIME=2020-02-07T00:00:00
{ echo -e "$FROM_TIME,$TO_TIME";}>input1.csv
{ echo -e "from_time,to_time"; cat input1.csv;} > input.csv

第一行存储值 第二行负责添加列名


1
你应该编辑你的回答,它不够清晰并且包含错误(例如第二个 echo 存在未匹配的双引号)。 - tonjo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接