用变量替换第一列csv

时间:2014-02-25 03:29:38

标签: bash csv sed awk

我无法相信我在bash / linux社区的其他地方找不到我的问题。我只想用我的csv文件的第一列替换变量......

0,8,9,10
0,8,9,10
0,8,9,10
0,8,9,10
0,8,9,10
0,8,9,10


2/24/14,8,9,10
2/24/14,8,9,10
2/24/14,8,9,10
2/24/14,8,9,10
2/24/14,8,9,10
2/24/14,8,9,10

我只是想用$date替换第一列,但所有awk命令都不允许将变量替换为替换。

5 个答案:

答案 0 :(得分:11)

这应该有效:

awk -v dt="$date" 'BEGIN{FS=OFS=","}{$1=dt}1' inputFile

<强>阐释:

  • 使用-v选项设置awk变量并为其指定shell变量。
  • 将输入字段分隔符和输出字段分隔符设置为,(因为它是csv)
  • $1的值设置为awk变量。
  • 1是打印修改后的$1行。

答案 1 :(得分:2)

sed 's#^[^,]*#2/24/14#' filename

应该这样做。如果您想使用当前日期,您应该:

DATE=$(date +'%d/%m/%y')
sed "s#^[^,]*#$DATE#" filename

这是在逗号之前查找第一个项目并将其替换为日期。使用#作为分隔符,您可以输入日期而无需转义/字符。

答案 2 :(得分:1)

perl -pe 's/.*?,/2\/24\/14/' your_file

测试here

答案 3 :(得分:1)

每次处理复杂的数据格式时,都应该使用正确的解析器,CSV是复杂的数据格式(没有任何正确的定义和充满怪癖。没有RFC 4180不是定义。这是相当开玩笑的。有很多违反RFC 4180的数据和几乎所有体面的CSV解析器都忽略了这个RFC,因为它不起作用。)

perl -mText::CSV_XS -e'$d=shift@ARGV;$csv=Text::CSV_XS->new({ binary => 1, eol => $/ });while(my$row=$csv->getline(*ARGV)){$$row[0]=$d;$csv->print(*STDOUT,$row)}' "$date"

答案 4 :(得分:0)

使用awk

更改为当前日期
echo "0,8,9,10" | awk '{sub(/[^,]+/,d)}8' d="$(date +'%d/%m/%y')"
25/02/14,8,9,10

[^,]+,的所有内容都将替换为d日期