【问题标题】:Replace blank value with previous non blank first column value using awk (value separated columns)使用 awk 将空白值替换为先前的非空白第一列值(值分隔列)
【发布时间】:2018-06-19 13:47:55
【问题描述】:

我有两列逗号分隔的文件,其中第一列始终为空,第二列有时为空(当最后一列为空时,没有最后的逗号):

,value_c1_1
,,value_c2_1
,,value_c2_2
,,value_c2_3
,value_c1_2

我想用 awk 用之前的非空列值填充空列值,然后去掉第二列为空的行:

,value_c1_1,value_c2_1
,value_c1_1,value_c2_2
,value_c1_1,value_c2_3

the answer to this question的最大区别

awk '/^ /{$0=(x)substr($0,length(x)+1)}{x=$1}1' file

是字段是字符分隔的(而不是固定长度)并且第一列始终为空。

【问题讨论】:

    标签: awk


    【解决方案1】:
    awk -F, 'BEGIN { OFS = FS } { if ($2 == "") $2 = last2; else last2 = $2; print }'
    

    如果第 2 列为空,则将其替换为保存的值;否则,请保存第 2 列中的值以供将来使用。打印该行。 (BEGIN 块确保输出字段分隔符 OFS 与(输入)字段分隔符 FS 相同。)

    如果您只想打印包含 3 个字段的行,那么:

    awk -F, 'BEGIN { OFS = FS }
             { if ($2 == "") $2 = last2; else last2 = $2; if (NF == 3) print }'
    

    【讨论】:

    • @quick question:你认为grep可以做到(更快)吗?
    • 我想不出用grep 做的方法——grep 选择而不替换。在我看来,Awk 是完成这项工作的正确工具。它也可以在 Perl 或 Python(或……)中完成,并且可能使用 sed 完成,但它会很痛苦且晦涩难懂,而在 Awk 中则简单明了。
    • 感谢您的及时回答(我只是想检查一下我没有通过仅要求 awk 的答案来强制对问题进行错误的约束!)
    猜你喜欢
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多