Awk 替换bash中N列中的值

Awk 替换bash中N列中的值,awk,sed,grep,Awk,Sed,Grep,我有下面的样品 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中的79到hh 我检查在其他论坛它可以做一些像下面的代码,

我有下面的样品

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中仅以b1开头且长度必须为6

如果我这样做

cat myfile | grep -x '.\{6\}'  | grep "^[b1]"
它给了我一个空白的结果


对于仅以b1开头且长度为6的行元素,awk是什么(如$2~/b1/),您需要组合部分以识别包含
79
的行元素,并使用
sub()对其进行替换

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

我上面的那个只对包含
$2
作为
79
的行执行条件替换,并执行替换。对于与默认打印不匹配的其他行,将执行
{..}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

如果
$2==“797979”
中的值替换所有实例,该怎么办?另外,2019年有很多
88
hh
(+1)..@JamesBrown这是一个样本数据,我很了解实际文件,我只是想知道如何做到这一点的方法…:)@WDC:一般不建议使用扩展问题,您需要单独提问questions@WDC当前位置我已经在答案中回答了你的扩展问题now@Inian对我来说完美的工作,我所需要知道的就是
awk -F, 'BEGIN { OFS = FS } $2 ~/^b1/ && length($2) == 6' file