【问题标题】:AWK - Replacing Value Of Selected Column Destroys Output FormatAWK - 替换选定列的值会破坏输出格式
【发布时间】:2016-03-20 21:39:12
【问题描述】:

我有一个格式如下的 .csv 文件。 id|name|date

我正在使用以下 awk 命令来更改一行中的特定列并且它可以工作。 awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv

我想保存输出,但是格式被破坏了。

我想要什么:100|James|2015

我得到了什么:100 James 2015

如何避免第二个并获得第一个?

【问题讨论】:

    标签: awk outputformat


    【解决方案1】:

    您可以设置 OFS,即输出字段分隔符,如下例所示:

    awk -F\| -v OFS=\| '{print $1, $2, $3 }'  test.psv 
    
    • -v OFS=\| 将值| 分配给OFS 变量。它是BEGIN { OFS = "|" } 块的替代方案。
    • | 需要受到 shell 的保护,因为 shell 级别的含义是将一个命令输出管道传输到另一个命令的输入。使用"|"\| 是两种方法。

    【讨论】:

    • 工作得很好,非常感谢。注意解释“|”之间的区别和'\|' ?还有'-v'?
    【解决方案2】:

    永远不要让 shell 变量扩展成为 awk 脚本主体的一部分:

    awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
    

    因为给定这些 shell 变量的各种值,它会让您面临潜在的错误。而是从 shell 变量中填充 awk 变量并在脚本中使用 awk 变量:

    awk -F "|" -v col="$col" -v val="$val" '{$col=val}1' filename.csv
    

    不过,就您的具体问题而言,awk 会在您为字段分配值时重建记录,因此您需要 OFS 具有与 FS 相同的值:

    awk -v col="$col" -v val="$val" 'BEGIN{FS=OFS="|"} {$col=val}1' filename.csv
    

    【讨论】:

    • 不客气。如果您打算在 UNIX 上进行更多的文本操作,我强烈推荐 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书。
    猜你喜欢
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多