【问题标题】:replace value in N column in bash替换bash中N列中的值
【发布时间】:2019-12-24 16:00:23
【问题描述】:

我有一个下面的示例

a12,b12122,c12,d12
a13,887988,c13,d13
a14,b14121,c79,d13 

我只想将 79 更改为 hh,前提是进入第 2 列。

当我这样做时

awk -F, '$2~"79"' myfile | sed 's/79/hh/g' > temp && mv  temp myfile 

它给了我第二排,第一排和第三排消失了。

我应该在我的代码中替换什么,所以它只替换值 887988 中的 79hh

我在其他论坛上查看它可以完成类似下面的代码,但我想我正在做一些代码错误

$ awk '{gsub("79","hh",$2)}1' myfile 

a12,b112122,c12,d12
a13,887988,c13,d13
a14,b14121,c79,d13 

[编辑] 感谢以下工作

awk -F, 'BEGIN { OFS = FS } $2 ~ /79/ { sub(/79/, "hh", $2) }1' file

但是当我尝试在新示例中删除逗号时...

我的样本是

cat > myfile
"a12","b112122","c12,d12"
a13,887988,c13,d13
a14,b14121,c79,d13

当我尝试通过

从第 2 列中删除 "
awk -F, 'BEGIN { OFS = FS } $2 ~ /"/ { sub(/"/, "", $2) }1' myfile 
"a12",b112122","c12,d12"
a13,887988,c13,d13
a14,b14121,c79,d13

它只删除了 1 个逗号,而不是 b112122 我得到的是 b112122"

我做错了什么?

我有我的代码的第 2 部分。

我如何才能仅在列 2 中 grep 以 b1 开头且长度必须为 的那些>6

如果我这样做了

cat myfile | grep -x '.\{6\}'  | grep "^[b1]"

它给了我一个空白的结果。

什么是 awk(比如 $2 ~ /b1/ )只有那些以 b1 开头并且长度为 6 的人

【问题讨论】:

  • 如果$2=="797979"中的值,替换所有实例怎么办?此外,2019 年有很多 88hh (+1)...
  • @JamesBrown 它是一个示例数据,我非常了解的实际文件,我只是了解我将如何做到这一点的路径...... :))
  • @WDC:一般不推荐扩展问题,需要单独提问
  • @WDC:我已经在答案中回答了你的扩展问题
  • @Inian 对我来说是完美的工作,我只需要知道“”有什么问题

标签: awk sed grep


【解决方案1】:

您需要组合用于识别包含79 的行元素并使用sub() 对其进行替换的部分

awk -F, 'BEGIN { OFS = FS } $2 ~ /79/ { sub(/79/, "hh", $2) }1' file

您尝试使用sed 的问题是,第一个awk 仅过滤第二行,在替换和重定向时会生成一个只有一行的新文件。

我上面的那个,只对包含$279 的行进行条件替换并进行替换。对于其他不匹配的行,默认打印发生{..}1 以打印出该行。

如果您正在寻找一种更优化的方法,您可以在进行替换之前避免冗余检查,如下所示。因为sub() 忽略对不包含该模式的行执行任何操作,在这种情况下,该行只是简单地打印。

awk -F, 'BEGIN { OFS = FS } sub(/79/, "hh", $2) 1' file

对于以b1 开头且长度包含 6 的附加问题,您需要这样做

awk -F, 'BEGIN { OFS = FS } $2 ~/^b1/ && length($2) == 6' file

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 2017-12-22
    • 1970-01-01
    • 2021-10-16
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多