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中的79到hh
我检查在其他论坛它可以做一些像下面的代码,但我想我做了一些代码错误
$ 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