【嵌入式开发 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

下面是使用 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

这里是命令的解释:

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

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

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

awk gsub 学习

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

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

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

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

hello world, hello awk, hello gsub

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

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

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

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

hi world, hi awk, hi gsub

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 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 

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

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

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

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

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

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

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

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

可以使用以下命令:

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

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

awk 在指定行后新加一行

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

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

这里是命令详解:

  • 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 

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公CodingCos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值