用变量替换第一列csv

Posted

技术标签:

【中文标题】用变量替换第一列csv【英文标题】:Replacing first column csv with variable 【发布时间】:2014-03-27 01:46:22 【问题描述】:

我不敢相信我在 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 命令都不允许变量作为替换。

【问题讨论】:

【参考方案1】:

这应该有效:

awk -v dt="$date" 'BEGINFS=OFS=","$1=dt1' inputFile

说明:

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

【讨论】:

解释得很好@Jaypal +1 这是我第一次在大括号或圆括号(圆括号)之后收到1 的解释。这有助于我理解其他一些命令。【参考方案2】:
sed 's#^[^,]*#2/24/14#' filename

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

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

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

【讨论】:

sed "s|[^,]*|$( date +'%d/%m/%y' )|" YourFile 一次性完成【参考方案3】:
perl -pe 's/.*?,/2\/24\/14/' your_file

测试here

【讨论】:

【参考方案4】:

每次处理复杂的数据格式时,都应该使用正确的解析器,而 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"

【讨论】:

【参考方案5】:

使用awk更改为当前日期

echo "0,8,9,10" | awk 'sub(/[^,]+/,d)8' d="$(date +'%d/%m/%y')"
25/02/14,8,9,10

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

【讨论】:

以上是关于用变量替换第一列csv的主要内容,如果未能解决你的问题,请参考以下文章

PSQL /copy : 变量替换不起作用 | PostgreSQL 11

检查一个大文件 .csv 并替换,并将其分类在一列中

替换第一列文本中的特定字符

大神求解在js数组中怎么向数组添加变量的值,下面怎么用xiaoshuo12替换掉name:小说,data的第一个数19

用唯一的随机字符串替换列中的字符串

Sed 删除匹配行,匹配的字符用Shell变量替换,且变量里含有斜杠“/”时,无法删除