【问题标题】:replace nth value of a csv line using sed in bash在 bash 中使用 sed 替换 csv 行的第 n 个值
【发布时间】: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

先谢谢了,请帮忙!

【问题讨论】:

    标签: csv awk sed


    【解决方案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 inplaceperl -iruby -ised -i 等)都会获取文件的副本,因此- 您真的是否关心获取文件的副本,或者您只是不想在代码中使用cmd file > tmp && mv tmp file 明确地执行此操作,而是更喜欢cmd -i filecmd -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:替换表达式中的错误选项
    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 2020-08-16
    • 2021-03-29
    • 2017-11-22
    • 2020-09-22
    • 2015-11-10
    • 2014-08-04
    • 2016-01-20
    相关资源
    最近更新 更多