当前位置 : 首页 » 互动问答 » 正文

如何用awk替换某些列中的字符

分类 : 互动问答 | 发布时间 : 2018-04-27 16:07:00 | 评论 : 1 | 浏览 : 63 | 喜欢 : 0

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

“col1”;“col2”;“col3”;“col4”;“col5”;
“eiusmod”; “tempor”; “incididunt”; “UT”; “labore”;
“等”, “dolore”; “蚤”; “aliqua”; “UT”;
“enim”, “广告”, “微量”, “veniam”; “QUIS”;
“UT”, “aliquip”, “前”, “EA”; “commodo”;
“nostrud”; “实习”; “ullamco”; “laboris”; “暂准”;

实际数据(标题行加上三条记录):

“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#”“”;“”对一个事件发表了评论“#”#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#!

你有一个来自#FROM_USER的新通知#

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

#信息#

------------------------------------------;“你好,#USER_NAME#!

Vocabulary?um noma nova notifica???o de de#FROM_USER#

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

 #信息#

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

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

 gawk'BEGIN {FS =“;” }; $ 3〜/ m / {print $ 3“;” $ 4} NR == 30 {exit}'OFS =';' AWK-测试

结果是:

“magna”;“aliqua”
“微量”; “veniam”
“ullamco”; “laboris”

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

在测试awk上需要的输出:

“xagna”;“aliqua”
“xinim”; “veniam”
“ullaxco”; “laboris”

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

预先感谢您!

回答(1)

  • 1楼
  • awk解决方案:

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

    这将适用于real 250.000行文件:

     $ awk -f tst.awk文件
    “xagna”; “aliqua”
    “xinim”; “veniam”
    “ullaxco”;“laboris
    

    或单行:

     awk'BEGIN {FS = OFS =“;”} NR> 1 && sub(/ m /,“x”,$ 3){print $ 3,$ 4}'file

相关阅读: