用于将字符串附加到第二列中所有CSV字段末尾的Shell脚本

时间:2012-02-29 18:54:19

标签: linux bash parsing shell awk

我正在尝试编写一个BASH脚本,它将:00:00 附加到CSV文件的第二个字段中所有值的末尾。

我试过阅读'awk'手册页,但我不知道如何完成这个。任何帮助表示赞赏!

源文件:

2012-02-29,00,Manhatten,New York,244
2012-02-29,01,Manhatten,New York,246
2012-02-29,02,Manhatten,New York,554
2012-02-29,03,Manhatten,New York,854
2012-02-29,04,Manhatten,New York,488

结果文件:

2012-02-29,00:00:00,Manhatten,New York,244
2012-02-29,01:00:00,Manhatten,New York,246
2012-02-29,02:00:00,Manhatten,New York,554
2012-02-29,03:00:00,Manhatten,New York,854
2012-02-29,04:00:00,Manhatten,New York,488

4 个答案:

答案 0 :(得分:1)

以下是过滤转化的命令:

awk 'BEGIN { FS=","; OFS="," } (NF>=2) { $2=$2 ":00:00"; } (1)'

如果您有一个存储源数据的文件source.txt和要存储输出的文件result.txt,则执行以下命令:

awk 'BEGIN { FS=","; OFS="," } (NF>=2) { $2=$2 ":00:00"; } (1)' source.txt >result.txt

如果您有多个输入文件,可以在参数中添加它们。 有关详细信息,请参阅manpage of awk

答案 1 :(得分:0)

一个带perl的衬里

perl -F, -nae '$F[1].=":00:00";print join(",", @F);'

答案 2 :(得分:0)

您也可以使用sed(这是我的首选),但使用awk也很好..

您需要的是在每列中提取值,然后将其打印回来,但在打印第二列时,请附加:00:00

请参阅此示例,尝试一下,如果您有一些具体问题请回去:

$ cat a.txt
2012-02-29,00,Manhatten,New York,244
2012-02-29,01,Manhatten,New York,246
2012-02-29,02,Manhatten,New York,554
2012-02-29,03,Manhatten,New York,854
2012-02-29,04,Manhatten,New York,488
$ awk -F , '{print $1 "-" $2 "-" $3 "-" $4 "-" $5}' a.txt
2012-02-29 - 00 - Manhatten - New York - 244
2012-02-29 - 01 - Manhatten - New York - 246
2012-02-29 - 02 - Manhatten - New York - 554
2012-02-29 - 03 - Manhatten - New York - 854
2012-02-29 - 04 - Manhatten - New York - 488
$

答案 3 :(得分:0)

这可能对您有用:

sed 's/,/:00:00,/2' file
2012-02-29,00:00:00,Manhatten,New York,244
2012-02-29,01:00:00,Manhatten,New York,246
2012-02-29,02:00:00,Manhatten,New York,554
2012-02-29,03:00:00,Manhatten,New York,854
2012-02-29,04:00:00,Manhatten,New York,488

或者这个:

awk  '{sub(/,../,"&:00:00")}1' file
2012-02-29,00:00:00,Manhatten,New York,244
2012-02-29,01:00:00,Manhatten,New York,246
2012-02-29,02:00:00,Manhatten,New York,554
2012-02-29,03:00:00,Manhatten,New York,854
2012-02-29,04:00:00,Manhatten,New York,488