awk的读取处理结构数据的案例

awk 是一种用于读取和处理结构化数据的极佳工具.FS (字段分隔符)变量设置成 ":",可以分析出一个复杂文件的各种我们所要取得的字段;但是对于一个多行记录需要一些其他变量来辅助;比如RS,OFS,ORS等;
如果要分析占据多行的记录,仅仅依靠设置 FS  是不够的。在这些情况下,我们还需要修改 RS  记录分隔符变量。RS 变量告诉awk 当前记录什么时候结束,新记录什么时候开始;
以下案例:
[root@Slave02 ~]# cat a.txt 
jimmy the Weasel
100 pleasant Drive
San Francisco, Ca 12345

Big Tony
200 Incognito Ave.
Suburbia, WA 67890
[root@Slave02 ~]# 
完成处理“联邦证人保护计划”所涉及人员的地址列表的任务;
[root@Slave02 ~]# cat address.awk 
BEGIN {
   FS="\n"
   RS=""
}

{
   print $1 "," $2 "," $3
}
[root@Slave02 ~]#
[root@Slave02 ~]# awk -f address.awk a.txt
jimmy the Weasel,100 pleasant Drive,San Francisco, Ca 12345
Big Tony,200 Incognito Ave.,Suburbia, WA 67890
[root@Slave02 ~]# 
加入OFS变量分割符的;
[root@Slave02 ~]# vi address.awk 
BEGIN {
   FS="\n"
   RS=""
   OFS=", "
}

{
   print $1 "," $2 "," $3
}
~
~
~
~
~
"address.awk" 9L, 73C written
[root@Slave02 ~]# awk -f address.awk a.txt
jimmy the Weasel,100 pleasant Drive,San Francisco, Ca 12345
Big Tony,200 Incognito Ave.,Suburbia, WA 67890
[root@Slave02 ~]# 
awk 还有一个特殊变量 ORS ,全称是“输出记录分隔符”。通过设置缺省为换行 ("\n")  的 OFS ,我们可以控制在 print  语句结尾
自动打印的字符。缺省 ORS  值会使 awk  在新行中输出每个新的 print  语句。如果想使输出的间隔翻倍,可以将 ORS  设置成 
"\n\n" 。或者,如果想要用单个空格分隔记录(而不换行),将 ORS  设置成 "" 。
[root@Slave02 ~]# vi address.awk 
BEGIN {
   FS="\n"
   RS=""
   ORS=""
}

{
    x=1
    while ( x<NF ) {
           print $x "\t"
           x++
       }
           print $NF "\n"
}
~
~
~
~
~
~
"address.awk" 14L, 151C written
[root@Slave02 ~]# awk -f address.awk a.txt
jimmy the Weasel        100 pleasant Drive      San Francisco, Ca 12345
Big Tony        200 Incognito Ave.      Suburbia, WA 67890
[root@Slave02 ~]#
首先,将字段分隔符 FS  设置成 "\n" ,将记录分隔符 RS  设置成 "" ,这样 awk  可以象以前一样正确分析多行地址。然后,将输
出记录分隔符 ORS  设置成 "" ,它将使 print  语句在每个调用结尾 不 输出新行。这意味着如果希望任何文本从新的一行开始,
那么需要明确写入 print "\n" 。 
在主代码块中,创建了一个变量 x 来存储正在处理的当前字段的编号。起初,它被设置成 1 。然后,我们使用 while  循环(一
种 awk  循环结构,等同于 C 语言中的 while  循环),对于所有记录(最后一个记录除外)重复打印记录和 tab  字符。最后,
打印最后一个记录和换行;此外,由于将 ORS  设置成 "" ,print 将不输出换行。程序输出如下,这正是我们所期望的:
我们想要的输出。不算漂亮,但用 tab 定界,以便于导入电子表格。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值