• 【嵌入式开发 Linux 常用命令系列 7.2 -- awk 找到空格并插入字符】


    awk 列字符处理

    在工作中经常需要需要复制PDF文件表格中的数据,但是复制完成后,就不会以表格的形式存在了。所以想能不能使用linux 脚本或者命令来将复制的内容重新做成表格,比如做成 CSDN markdown 识别的表格。这个时候就可以使用 awk 命令来完成这个工作了。

    如下内容是从PDF拷贝过来的内容(ARM 的寄存器表):

    Number Offset Name Access Width Type Description
    0 0x000 - - - - Reserved
    1 0x004 TRCPRGCTLR RW 32 Trace Programming Control Register
    2 0x008 TRCPROCSELR RW 32 Trace PE Select Control Register
    3 0x00C TRCSTATR RO 32 Trace Trace Status Register
    4 0x010 TRCCONFIGR RW 32 Trace Trace Configuration Register
    5 0x014 - - - - Reserved
    6 0x018 TRCAUXCTLR RW 32 Trace Auxiliary Control Register
    7 0x01C - - - Trace Reserved
    8 0x020 TRCEVENTCTL0R RW 32 Trace Event Control 0 Register
    9 0x024 TRCEVENTCTL1R RW 32 Trace Event Control 1 Register
    10 0x028 - - - - Reserved
    11 0x02C TRCSTALLCTLR RW 32 Trace Stall Control Register
    12 0x030 TRCTSCTLR RW 32 Trace Global Timestamp Control Register
    13 0x034 TRCSYNCPR RWa 32 Trace Synchronization Period Register
    14 0x038 TRCCCCTLR RW 32 Trace Cycle Count Control Register
    15 0x03C TRCBBCTLR RW 32 Trace Branch Broadcast Control Register
    16 0x040 TRCTRACEIDR RW 32 Trace Trace ID Register
    17 0x044 TRCQCTLR RW 32 Trace Q Element Control Register
    18-31 0x048-0x07C - - - - Reserved
    32 0x080 TRCVICTLR RW 32 Trace ViewInst Main Control Register
    33 0x084 TRCVIIECTLR RW 32 Trace ViewInst Include/Exclude Control
    Register
    34 0x088 TRCVISSCTLR RW 32 Trace ViewInst Start/Stop Control Register
    35 0x08C TRCVIPCSSCTLR RW 32 Trace ViewInst Start/Stop PE Comparator
    Control Register
    36-39 0x090-0x09C - - - - Reserved
    40 0x0A0 TRCVDCTLR RW 32 Trace ViewData Main Control Register
    41 0x0A4 TRCVDSACCTLR RW 32 Trace ViewData Include/Exclude Single
    Address Comparator Control Register
    42 0x0A8 TRCVDARCCTLR RW 32 Trace ViewData Include/Exclude Address
    Range Comparator Control Register
    43-63 0x0AC-0x0FC - - - - Reserved
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    下面是使用 awk 命令简单处理后的效果:

    NumberOffsetNameAccessWidthTypeDescription
    00x000----Reserved
    10x004TRCPRGCTLRRW32TraceProgramming
    20x008TRCPROCSELRRW32TracePE
    30x00CTRCSTATRRO32TraceTrace
    40x010TRCCONFIGRRW32TraceTrace
    50x014----Reserved
    60x018TRCAUXCTLRRW32TraceAuxiliary
    70x01C---TraceReserved
    80x020TRCEVENTCTL0RRW32TraceEvent
    90x024TRCEVENTCTL1RRW32TraceEvent
    100x028----Reserved
    110x02CTRCSTALLCTLRRW32TraceStall
    120x030TRCTSCTLRRW32TraceGlobal
    130x034TRCSYNCPRRWa32TraceSynchronization
    140x038TRCCCCTLRRW32TraceCycle
    150x03CTRCBBCTLRRW32TraceBranch
    160x040TRCTRACEIDRRW32TraceTrace
    170x044TRCQCTLRRW32TraceQ
    18-310x048-0x07C----Reserved
    320x080TRCVICTLRRW32TraceViewInst
    330x084TRCVIIECTLRRW32TraceViewInst
    Register
    340x088TRCVISSCTLRRW32TraceViewInst
    350x08CTRCVIPCSSCTLRRW32TraceViewInst
    ControlRegister
    36-390x090-0x09C----Reserved
    400x0A0TRCVDCTLRRW32TraceViewData
    410x0A4TRCVDSACCTLRRW32TraceViewData
    AddressComparatorControlRegister
    420x0A8TRCVDARCCTLRRW32TraceViewData
    RangeComparatorControlRegister
    43-630x0AC-0x0FC----Reserved

    处理命令如下

    awk '{gsub(/ /,"&|"); print}' csdn.txt
    
    • 1

    这里是命令的解释:

    • awk 是文本处理的命令;
    • gsub(/ /,"&X")gsub函数,它查找每个空格(/ /)并用该空格和字符"|“(”&|")替换它。“&”代表原始匹配的内容,此处即空格;
    • print 是用来打印每一行;
    • filename 是你要处理的文件名。

    这个命令会读取文件中的每一行,并在每个空格后面插入字符"X",然后打印出来。

    注意: 处理完成后还需在表头后面加上一行:|-|-|-|-|-|-|-|,这个是 markdown 表格的识别符。

    awk gsub 学习

    gsub 是awk中的一个函数,用于进行全局替换。其语法格式如下:

    gsub(regexp, replacement [, target])
    
    • 1
    • regexp 是一个正则表达式,用于匹配你想要替换的内容。
    • replacement 是你想要替换成的内容。
    • target 是一个可选的参数,表示你想要替换的字段。如果省略,那么默认替换整行。

    gsub 函数会查找 target 中所有匹配 regexp 的部分,并用 replacement 进行替换。所有的替换操作在一个字段或整行中都是全局的,也就是说,会替换所有匹配的部分,而不仅仅是第一个。

    举个例子,假设我们有一个文件,其中一行是:

    hello world, hello awk, hello gsub
    
    • 1

    我们想要把所有的"hello"替换成"hi",可以使用下面的命令:

    awk '{gsub(/hello/,"hi"); print}' filename
    
    • 1

    /hello/ 是一个正则表达式,匹配所有的"hello","hi"是我们想要替换成的内容。

    运行上面的命令后,输出将会是:

    hi world, hi awk, hi gsub
    
    • 1

    可以看到,所有的"hello"都被"hi"替换了。

    替换文本中第一个空格为某个字符

    要使用 awk 替换每一行的第一个空格为某个字符,比如逗号(,),你可以使用以下的 awk 命令:

    awk '{sub(" ", ","); print}' inputfile > outputfile 
    
    • 1

    这条命令会读取 inputfile 文件,将每一行的第一个空格替换为逗号,并将结果写入 outputfile 文件中。
    解释如下:

    • sub(" ", ","):这是 awksub 函数,用于替换字符串。它将每一行的第一个空格(" ")替换为逗号(",")。
    • print:这是 awk 的打印命令,用来输出处理后的行。
    • inputfile:要处理的输入文件的名称。
    • >:用于将 awk 命令的输出重定向到 outputfile 文件中。

    如果你想要将替换后的内容直接输出到屏幕而不保存到文件,可以省略输出重定向:

    awk '{sub(" ", ","); print}' inputfile 
    
    • 1

    此外,如果你想要替换的是另一个字符,只需把逗号(,)替换为你想要的字符即可。例如,将空格替换为下划线(_):

    awk '{sub(" ", "_"); print}' inputfile > outputfile 
    
    • 1

    请注意,这个命令只替换每一行的第一个空格。如果你想替换每一行的所有空格,可以使用 gsub 函数替代 sub 函数:

    awk '{gsub(" ", ","); print}' inputfile > outputfile 
    
    • 1

    gsub 函数会将每一行中所有匹配的模式替换掉。

    替换文本中第 n 个空格为某个字符

    例如要使用 awk 替换每一行的第二个空格为指定的字符,你可以使用以下的脚本,假设你想将第二个空格替换为井号(#):

    awk 'BEGIN{FS=OFS=""}{for(i=1;i<=NF;i++){if($i==" "){counter++}if(counter==2){$i="#";counter++} }print}' inputfile > outputfile 
    
    • 1

    这条命令的工作方式如下:

    • BEGIN{FS=OFS=""}:在 BEGIN 块中设置字段分隔符(FS)和输出字段分隔符(OFS)为空字符串,这样 awk 会将每个字符当作一个字段。
    • for(i=1;i<=NF;i++):遍历每一行的每一个字符。
    • if($i==" "){counter++}:如果字符是空格,则增加计数器 counter
    • if(counter==2){$i="#";counter++}:如果计数器达到2(即遇到第二个空格),则将该空格替换为井号(#),并增加计数器以避免替换后续的空格。
    • print:打印修改后的行。

    在这个命令中,inputfile 是你想要处理的文件,而 outputfile 是保存更改后内容的新文件。

    awk 在文本中每一行的开始和结束添加某个字符

    要在文本的每一行开始和结束添加某个字符,可以使用 awkprint 语句来实现。以下是一个示例,它会在每一行的开始添加井号(#),并在每一行的结束添加感叹号(!):

    awk '{print "#" $0 "!"}' inputfile > outputfile 
    
    • 1

    这条命令按照以下方式工作:

    • awk:调用 awk 程序。
    • {print "#" $0 "!"}awk 的动作块。$0 代表整行的内容,print 用于输出。在这里,我们在 $0 前后添加了我们想要的字符。
    • inputfile:输入文件,即你想要处理的文件。
    • outputfile:输出文件,保存修改后的内容。

    该命令会读取 inputfile 文件,并将修改后的内容输出到 outputfile 文件中。如果你想直接在控制台上查看结果,可以省略重定向操作:

    awk '{print "#" $0 "!"}' inputfile 
    
    • 1

    请根据需要替换 #! 为你想要在每行开始和结束添加的字符。如果你想要在原文件中进行修改,可以先输出到一个临时文件然后替换原文件,例如:

    awk '{print "#" $0 "!"}' inputfile > temp && mv temp inputfile 
    
    • 1

    这条命令使用了一个临时文件 temp 来保存更改,然后将其移动到原始的 inputfile 文件中,从而实现了在原文件上的修改。在进行这种替换操作之前,确保备份原文件是一个好习惯。

    awk向指定行添加新的字符串

    可以使用以下命令:

    awk 'NR==3{print $0" new text"}' file.txt
    
    • 1

    其中,NR==3表示只对第三行进行操作,print $0" new text"表示将第三行的内容输出并在其末尾添加新的文本。您可以将"new text"替换为要添加的任何字符或字符串。

    awk 在指定行后新加一行

    在 Linux 中,使用 awk 在指定的行后添加一行可以使用如下命令:

    awk 'NR==lineNumber {print $0; print "newContent"; next}1' inputfile > outputfile 
    
    • 1

    这里是命令详解:

    • NR==lineNumberNRawk 的内置变量,代表 “当前行号”。lineNumber 应该是你希望在其后添加新行的行号。
    • {print $0; print "newContent"; next}:如果当前行号与指定的行号相等,则执行花括号内的动作。print $0 输出当前行,print "newContent" 输出你希望添加的新行的内容,next 跳过对当前行的进一步处理。
    • 1:在 awk 中,1 是一种常见的技巧,用于默认打印当前行。这是因为 1 会被 awk 评估为真,导致它执行默认操作 —— 打印当前行。

    例如,如果你想要在第 3 行后添加一行,内容为 “This is a new line”,你可以这样做:

    awk 'NR==3 {print $0; print "This is a new line"; next}1' inputfile > outputfile 
    
    • 1

    这会将更改后的内容写入 outputfile。如果你希望直接更改原文件,可以使用以下命令:

    awk 'NR==3 {print $0; print "This is a new line"; next}1' inputfile > temp && mv temp inputfile 
    
    • 1

    这会将更改保存到临时文件 temp 中,然后将这个临时文件移动到原始 inputfile 的位置。在做这样的替换之前,最好做好备份。

  • 相关阅读:
    PHP深入
    驱动程序开发:Linux内核自带LED使能
    postman做接口测试
    102. 管道漫游案例
    SQLite 学习笔记1 - 简介、下载、安装
    GBase 8c向表中插入数据(一)
    CI/CD :Pipeline
    Linux(二)LED驱动程序框架(总线设备驱动)
    k8s容器定时伸缩(CronHPA)
    15.(地图数据篇)百度午夜蓝地图瓦片数据获取--java代码
  • 原文地址:https://blog.csdn.net/sinat_32960911/article/details/132766559