如何用awk替换特定列中的字符

How to replace character in certain column with awk

我的文件 awk-test 中的字段用括号括起来并用分号分隔:

"col1";"col2";"col3";"col4";"col5";
"eiusmod";"tempor";"incididunt";"ut";"labore";
"et";"dolore";"magna";"aliqua";"Ut";
"enim";"ad";"minim";"veniam";"quis";
"ut";"aliquip";"ex";"ea";"commodo";
"nostrud";"exercitation";"ullamco";"laboris";"nisi";

真实数据(header行加三条记录):

"col1";"col2";"col3";"col4";"col5";
"/absence/lang/#LANG_ID#/.descr.php";"BP2_DESCR";"Dodaj";"Add";"Adicionar";
"/cal/lang/#LANG_ID#/cal_feed.php";"LF_COMM_MSG";"je komentiral ""#EVENT_TITLE#""";"commented on an event ""#EVENT_TITLE#""";"comentado sobre o evento ""#EVENT_TITLE#""";
"/mod/lang/#LANG_ID#/set_events.php";"IM_NOTIFY";"Pozdravljeni #USER_NAME#!

#FROM_USER# vam je poslal(a) sporocilo.

------------------------------------------

#FROM_USER#: #MESSAGE#

------------------------------------------;"Hello #USER_NAME#!

You have a new notification from #FROM_USER#

------------------------------------------

#MESSAGE#

------------------------------------------;"Olá #USER_NAME#!

Você tem uma nova notificação de #FROM_USER# 

------------------------------------------

 #MESSAGE# 

------------------------------------------;

如果第 3 列有字符,我知道如何打印第 3 列和第 4 列的前 30 行 "m":

gawk 'BEGIN {FS = ";" } ;  ~/m/ {print  ";" } NR==30{exit}' OFS=';' awk-test 

结果是:

"magna";"aliqua"
"minim";"veniam"
"ullamco";"laboris"

但我不知道 (a) 如何在测试 30 行样本上用 "x" 替换 "m" (b) 如何在真正的 250.000 行文件中用 "x" 替换 "m"。

test-awk 上的期望输出:

"xagna";"aliqua"
"xinim";"veniam"
"ullaxco";"laboris"

实际上我只需要修正第3列中字符的错误。因此,我想知道如何写入更改的行并将未更改的行保存到一个包含固定第 3 列的新文件中?

提前致谢!

awk解决方案:

$ cat tst.awk
BEGIN{FS=OFS=";"}
NR>1 && sub(/m/,"x",){print , }

这将适用于您的 真实 250.000 行文件:

$ awk -f tst.awk file
"xagna";"aliqua"
"xinim";"veniam"
"ullaxco";"laboris

或者,单行:

awk 'BEGIN{FS=OFS=";"} NR>1 && sub(/m/,"x",){print , }' file