如何用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
我的文件 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