【问题标题】:awk or sed replacing specific $3 with ajacent $2awk 或 sed 用相邻的 $2 替换特定的 $3
【发布时间】:2012-10-17 19:08:16
【问题描述】:

文件看起来像

$1    $2      $3

Text  Text2    *

Text  Text4    Text3

我想在文件中搜索*'s 并将其替换为旁边列中的文本。在保留其余信息的同时...基本上将 * 逻辑替换为第 2 列。

目前我正在使用 sed 或 awk

awk : awk '{ if($3=*) {print$2}}' 有效...但我也想保留 1.2 美元

sed : sed -r 's/[*]//g'我无法正确地用 $2 替换 reg 表达式

有什么快速帮助、提示或技巧吗?

【问题讨论】:

  • 谢谢! :D 我喜欢命令行,并且会坚持下去

标签: sed awk


【解决方案1】:

file.txt的内容:

Text Text2 *
Text Text4 Text3

一种使用awk的方式:

awk '$3 == "*" { $3=$2 }1' file.txt

结果:

Text Text2 Text2
Text Text4 Text3

【讨论】:

  • 你的两个答案都帮助我写了 awk '{ if($3=="*") {$3=$2} {print $0}}' > file.txt 你们中的一个能解释一下“1 " 你有允许打印我从未见过的行。
  • awk, 1 后面的大括号只是print $0 的简写。
  • 太棒了,我知道基础知识,而且似乎写得有点长。好把戏
【解决方案2】:

使用 GNU sed \S\s 可以分别用于表示非空格和空格,因此您可以像这样完成您想要的:

sed -r '/(\S+)\s+(\S+)\s+\*/ s//\1 \2 \2/'

空的s/// 命令隐式使用来自// 的匹配项。

如果它在 steve 列出的输入上运行:

sed -r '/(\S+)\s+(\S+)\s+\*/ s//\1 \2 \2/' file.txt

输出:

Text Text2 Text2
Text Text4 Text3

如果您想保留列间空格,请使用:

sed -r '/(\S+)(\s+)(\S+)(\s+)\*/ s//\1\2\3\4\3/'

【讨论】:

    【解决方案3】:

    awk 解决方案:

    awk '$3=="*"{$3=$2}1' file
    

    【讨论】:

      猜你喜欢
      • 2021-01-30
      • 2010-10-27
      • 1970-01-01
      • 2011-01-23
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2016-03-13
      相关资源
      最近更新 更多