在 BASH 脚本中使用“awk”将列添加到 CSV 文件的末尾
Posted
技术标签:
【中文标题】在 BASH 脚本中使用“awk”将列添加到 CSV 文件的末尾【英文标题】:Add Column to end of CSV file using 'awk' in BASH script 【发布时间】:2012-03-19 09:25:39 【问题描述】:如何使用变量中的字符串在 CSV 文件的末尾添加一列?
输入.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
输出.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
【问题讨论】:
不是“ManhattAn”而不是“ManhattEn”吗? 可能是,我只是快速键入它作为示例。 【参考方案1】:您可以在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:更新了答案。 @Birei,我发现你的代码很有用,我已经将你的脚本打包并上传为#sparrow插件,以便每个人都可以重复使用它 - sparrowhub.org/info/csv-add-column @Birei,谢谢。谁能在要插入的字符串中包含引号?我想在.csv
文件的第二列中添加字符串“2.4.0”(inluding 引号),但下面的代码不起作用:awk -F"," 'BEGIN OFS = "," $2="\"2.4.0"\"; print' test.csv > output.csv
【参考方案2】:
我愿意:
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
【讨论】:
或:awk -v date="2012-02-29 16:13:00" -v OFS=, 'print $0, date'
【参考方案3】:
您可以设置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 以消除尾随逗号。我只是想弄清楚如何添加一个变量来代替硬编码的日期。我用一个例子更新了上面的问题。【参考方案4】:如果有人想通过 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
存储值的第一行 第二行负责添加列名
【讨论】:
你应该编辑你的答案,它不清楚并且包含错误(例如第二个echo
有一个不匹配的双引号)以上是关于在 BASH 脚本中使用“awk”将列添加到 CSV 文件的末尾的主要内容,如果未能解决你的问题,请参考以下文章
如何在bash脚本中使用Bash / Sed / Awk / Perl删除分隔字符串的最后一个元素[duplicate]
用于在分层目录结构中使用bash循环和AWK计算和提取结果的脚本