【问题标题】:sed replace data in the nth column if the line begins with X如果行以 X 开头,则 sed 替换第 n 列中的数据
【发布时间】:2013-11-01 16:31:19
【问题描述】:

我有一个如下所示的文件:

A|\^&|||something|||||somethingelse|||XZXZXZXXZ-C5|2013  
B|1||||ccccX|||||||||||||||||HERE||||||||||  
C|1|rfrfrfrf||^^^hghghghg|3||||||||||8||||||||||B| |||||  
D|1|^^^grpou|word|||||C||adam||2013|0123|  
E|1|G  

我想将文本 QQQ 插入任何以 B 开头的行的第 3 列。我已经尝试了几件事并且有几个选项,但我认为我在诊断中过于复杂了。

以下是我希望我能得出的结果:

A|\^&|||something|||||somethingelse|||XZXZXZXXZ-C5|2013  
B|1|QQQ|||ccccX|||||||||||||||||HERE||||||||||  
C|1|rfrfrfrf||^^^hghghghg|3||||||||||8||||||||||B| |||||  
D|1|^^^grpou|word|||||C||adam||2013|0123|  
E|1|G  

任何 sed 或 awk 一种衬里类型的建议都会很棒。

【问题讨论】:

    标签: replace sed awk


    【解决方案1】:
    awk 'BEGIN{FS=OFS="|"}/^B/{$3="QQQ"}1'
    

    如果您想在第三列中添加文本(如果有的话)而不是破坏它,

    awk 'BEGIN{FS=OFS="|"}/^B/{$3="QQQ"$3}1'
    

    要改为追加,请将$3 移动到另一侧。

    【讨论】:

    • 完全正确!我在找什么 我的 TYVM 中有一个 grep 和一个管道 awk 'BEGIN{FS=OFS="|"}/^B/{$3="QQQ"}1' zzzzzzzzzz A|\^&|||something |||||其他|||XZXZXZXXZ-C5|2013 B|1|QQQ|||ccccX||||||||||||||||这里||||||||| | C|1|rfrfrfrf||^^^hghghghg|3|||||||||8|||||||||B|||||| D|1|^^^grpou|字|||||C||亚当||2013|0123| E|1|G
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed '/^B/s/[^|]*/QQQ/3' file
    

    【讨论】:

      【解决方案3】:

      这假定每条记录中没有前导空格。它还替换第 3 列的现有内容

      awk -F'|' -v OFS='|' '$1 ~ /^B/{$3="QQQ"};{print}' input.txt
      

      【讨论】:

        【解决方案4】:
        awk -F'|' -v OFS="|" '/^B/{$3="QQQ"}7' file
        

        【讨论】:

        • 厌倦了使用1
        • @Kevin 我总是使用 7。因为我觉得右手食指比左手小指更方便。 ;)
        • 有趣。 7是我最难达到的数字。不过也许我会开始使用 9。
        • 我发现使用^1 的有趣之处在于,您可以轻松追踪@kent 编写的代码。当有人问awk 并说我试过这个时,你很快就会发现他们在从肯特得到解决方案之前就问了一个问题。
        • @sudo_O 哦..我没想到那部分..谢谢提醒。所以下次如果我在回答中写了愚蠢的脏 awk 代码,我会写 1... ;)
        猜你喜欢
        • 2018-07-10
        • 2020-12-25
        • 2021-09-16
        • 2021-10-18
        • 2021-01-12
        • 1970-01-01
        • 1970-01-01
        • 2013-09-12
        • 2011-05-17
        相关资源
        最近更新 更多