我无法相信我在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命令都不允许将变量替换为替换。
答案 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
日期