在 bash 中使用 sed 替换 csv 行的第 n 个值
Posted
技术标签:
【中文标题】在 bash 中使用 sed 替换 csv 行的第 n 个值【英文标题】:replace nth value of a csv line using sed in bash 【发布时间】:2021-10-16 22:28:23 【问题描述】:我有一些像下面这样的 csv
uid_01, joe, yes, no
uid_02, sam, yes, maybe
uid_03, c, ruth, yes, maybe
uid_04, **alan**, no, yes
我想用 ruby 替换 alan,uid 在这里是唯一的。我需要根据 $position 进行更改,知道如何在 sed 中获得它吗?
我还想同时给出模式和替换值作为参数。
尝试过类似的方法,但仅在最后一次输入时有效
sed -i '/^'$uid',/s/[^,]*$/'$returnvalue'/' $OUTPUT
先谢谢了,请帮忙!
【问题讨论】:
【参考方案1】:awk
更适合:
awk -v id='uid_04' -v repl='ruby' 'BEGIN FS=OFS=", "
$1 == id $2 = repl 1' file.csv
uid_01, joe, yes, no
uid_02, sam, yes, maybe
uid_03, c, ruth, yes, maybe
uid_04, ruby, no, yes
【讨论】:
谢谢。有没有办法在不复制的情况下覆盖同一个文件? 如果您有gnu-awk
,请使用awk -i inplace -v id='uid_04' -v repl='ruby' 'BEGIN FS=OFS=", " $1 == id $2 = repl 1' file.csv
@SankaranKutty 每个具有启用“就地”编辑选项的 Unix 工具(gawk -i inplace
、perl -i
、ruby -i
、sed -i
等)都会获取文件的副本,因此- 您真的是否关心获取文件的副本,或者您只是不想在代码中使用cmd file > tmp && mv tmp file
明确地执行此操作,而是更喜欢cmd -i file
或cmd -i inplace file
?
awk -v id1=$id -v repl='PASS' 'BEGIN FS=OFS="," ($1 == id1)$6 = repl 1' $OUTPUT > tmp && mv tmp $OUTPUT 使它工作,谢谢大家。 :) @EdMorton - 新手,gawk 没有出现在盒子里,所以我会暂时使用这个。感谢您的回复。
@anubhava 谢谢你能告诉我 1 附近的文件名是做什么的吗?【参考方案2】:
这可能对你有用(GNU sed):
id='uid_04' name='ruby' position=2
sed -i "/^$id,/s/[^,]*/ $name/$position" file
如果 id 是uid_04
,则将第二个字段替换为ruby
【讨论】:
对不起,它不起作用,sed:替换表达式中的错误选项以上是关于在 bash 中使用 sed 替换 csv 行的第 n 个值的主要内容,如果未能解决你的问题,请参考以下文章