awk处理文本的一点心得.txt

存储数据可以用文本,也可以用数据库,很难说哪个更好,只能说数据库更加适合大型的项目,而一些小的数据,
就不要用牛刀了,那么文本作为一种数据的存储方式,就要有一个工具来进行处理,awk就是这样的工具。


对于整个文本来说,首先要进行区别的就是记录。类似于数据的一条记录如(name,id)。
然后,就要区别,每条记录当中的字段,也就是数据库中的字段如name。




所以,就要定义记录的分隔符和字段的分隔符。
awk默认的,认为每行是个记录,每行中,空格或多个空格区别字段。


但是如果仅仅认为只能这么处理就太小看awk了、
首先来仔细的想想文本的本质。我们看的是处理过的文本,也就是显示的文本,和真正的asi码是不同的,比如
12
34
我们看到的是上面的情况,在内存中实际上是12\n34 
\n 是回车换行,对人们来说是不可见的。
对于一个计算机来说,他可不管显示什么,对他是没有任何意义的,或者说1和\n是没有任何的区别的。


所以完全可以用任何的字符来控制记录和字段的区别值,甚至是字符。
比如 azbzctt1z2z3 完全可以tt作为记录分割,z作为字段分割


即(a,b,c)和(1,2,3)


除了上面的区别,还有个区别。就是在打印的时候,print $1 $2
如果$1=zz $2=tt
那么即使$1和$2中间有空格,还是打印zztt
如果print $1,$2
那么print会认为$1和$2是不同字段,会在字段中间插入一个OFS,OFS默认是空格
上面的语句打印了 zz tt


同样的,print在打印了zztt后,还会在后面增加打印\n也就是换行,所以我们能看到很整齐的输出。
其实可以调整ORS="\n\n" 就会打印两个回车换行,那么就是空一行。




下面说一下重点,
在区别记录和字段的时候,即RS 和 FS的时候,""代表了一个或者多个空行 " "代表了一个或者多个空格
在输出的时候,则不同,""就是代表没有输出," "代表了一个空格


1
上面的本质是什么?1\n


上面的本质是什么?ORS 认为是空,RS则认为是一个或者多个\n

你可能感兴趣的:(awk处理文本的一点心得.txt)