求助大神 一个awk printRS,ORS,FS的问题帮忙看下为啥会是不同的结果???

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
AWK使用技巧
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口awk中RS,ORS,FS,OFS区别与联系
学习awk时,一定要记得动手去实践,只有在实践中才能发现问题,以下就我在学习中和实践中的经验,总结一下RS,ORS,FS,OFS的区别和联系。一,RS与ORS
1,RS是记录分隔符,默认的分隔符是\n,具体用法看下
[root@krlcgcms01 mytest]# cat test1
2,RS默认分割符\n
[root@krlcgcms01 mytest]# awk '{print $0}' test1
其实你可以把上面test1文件里的内容理解为,111 222\n333 444\n555 6666,利用\n进行分割。看下一个例子
3,自定义RS分割符
[zhangy@localhost test]$ echo "111 222|333 444|555 666"|awk 'BEGIN{RS="|"}{print $0,RT}'
结合上面一个例子,就很容易理解RS的用法了。
4,RS也可能是正则表达式
[zhangy@localhost test]$ echo "111 222a333 444b555 666"|awk 'BEGIN{RS="[a-z]+"}{print $1,RS,RT}'
111 [a-z]+ a
333 [a-z]+ b
555 [a-z]+
从例3和例4,我们可以发现一点,当RT是利用RS匹配出来的内容。如果RS是某个固定的值时,RT就是RS的内容。
5,RS为空时
[zhangy@localhost test]$ cat -n test2
[zhangy@localhost test]$ awk 'BEGIN{RS=""}{print $0}' test2
[zhangy@localhost test]$ awk 'BEGIN{RS="";}{print "&",$0,"&"}' test2
& 111 222 &
& 555 666 &
从这个例子,可以看出当RS为空时,awk会自动以多行来做为分割符。
6,ORS记录输出分符符,默认值是\n
把ORS理解成RS反过程,这样更容易记忆和理解,看下面的例子。
[zhangy@localhost test]$ awk 'BEGIN{ORS="\n"}{print $0}' test1
[zhangy@localhost test]$ awk 'BEGIN{ORS="|"}{print $0}' test1
111 222|333 444|555 666|
二,FS与OFS
1,FS指定列分割符
[zhangy@localhost test]$ echo "111|222|333"|awk '{print $1}'
111|222|333
[zhangy@localhost test]$ echo "111|222|333"|awk 'BEGIN{FS="|"}{print $1}'
2,FS也可以用正则
[zhangy@localhost test]$ echo "111||222|333"|awk 'BEGIN{FS="[|]+"}{print $1}'
3,FS为空的时候
[zhangy@localhost test]$ echo "111|222|333"|awk 'BEGIN{FS=""}{NF++;print $0}'
1 1 1 | 2 2 2 | 3 3 3
当FS为空的时候,awk会把一行中的每个字符,当成一列来处理。
4,RS被设定成非\n时,\n会成FS分割符中的一个
[zhangy@localhost test]$ cat test1
[zhangy@localhost test]$ awk 'BEGIN{RS="444";}{print $2,$3}' test1
222和333之间是有一个\n的,当RS设定成444后,222和333被认定成同一行的二列了,其实按常规思想是二行的一列才对。
5,OFS列输出分隔符
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $1,$2}' test1
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $1 OFS $2}' test1
test1只有二列,如果100列,都写出来太麻烦了吧。
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{print $0}' test1
[zhangy@localhost test]$ awk 'BEGIN{OFS="|";}{NF=NF;print $0}' test1
为什么第二种方法中的OFS生效呢?个人觉得,awk觉查到列有所变化时,就会让OFS生效,没变化直接输出了。
转载请注明
作者:海底苍鹰
没有更多推荐了,Linux:awk命令详解 | 张戈博客
博客宗旨 把最实用的经验,分享给最需要的读者,希望每一位来访的朋友都能有所收获!
<span class="tipso_style" id="tip-w" data-tipso=''>
浏览 7662357 次
留言 17927 条
随便挑了些,看你喜欢嘛
关于博客 张戈博客是关注互联网以及分享IT运维工作经验的个人博客,主要涵盖了操作系统运维、实用脚本编程以及博客网站建设等经验教程。我的博客宗旨:把最实用的经验,分享给最需要的读者,希望每一位来访的朋友都能有所收获!
) ) 企业互联网+转型实战:如何进行PB级别数据的架构变迁已关闭评论) ) )&>&AWK中FNR和NR,OFS和FS,RS和ORS.txt
AWK中FNR和NR,OFS和FS,RS和ORS.txt
上传大小:6KB
AWK中FNR和NR,OFS和FS,RS和ORS.txt
综合评分:5
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有1条
真的是好东西!
VIP会员动态
热门资源标签
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
AWK中FNR和NR,OFS和FS,RS和ORS.txt
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
AWK中FNR和NR,OFS和FS,RS和ORS.txt一、RS 与 ORS 差在哪
& 我们经常会说,awk是基于行列操作文本的,但如何定义“行”呢?这就是RS的作用。& 默认情况下,RS的值是\n。下面通过实例来理解下RS。&echo '1a2a3a4a5' | awk '{print $1}'
echo '1a2a3a4a5' | awk 'BEGIN{RS="a"}{print $1}'
5我们可以看到,在更改了RS的值后,awk定义的行已经不是我们实际意义中的行了。& 上面RS固定的字符串,RS也可以定义为正则表达式。&echo '1ab2bc3cd4de5' | awk 'BEGIN{RS="[a-z]+"}{print $1,RS,RT}'
1 [a-z]+ ab
2 [a-z]+ bc
3 [a-z]+ cd
4 [a-z]+ de
5 [a-z]+&当我们将RS设置为正则表达式的时候,RT这个变量就有作用了,RS的值始终为我们设定的正则,RT的值则是这个正则实际匹配到的内容。
如果RS被设置为空,那么awk会将连续的空行作为行分隔符,与RS设置成"\n\n+"有什么区别???& 1、忽略文件开头和结尾的空行。且文件不以记录分隔符结束,即最后不是空行,会将最后一个记录的尾\n去掉& 2、不设置RT变量(测试未发现规律,暂时认为RT变量不可用)& 3、影响FS变量
& 总结下RS的3种情况:& 1) 非空字符串&&&& 以固定字符串作为行分隔符,同时设置变量RT为固定字符串& 2) 正则表达式&&&& 以正则表达式作为行分隔符,同时设置变量RT为正则表达式实际匹配到的字符串& 3) 空字符&&&& 以连续的空行作为行分隔符,如果FS为单个字符,会将\n强制加入到FS变量中
& 理解了RS,再来理解ORS就简单了。RS是awk读取文件时的行分隔符,ORS则是awk输出时的行结束符。& 更简单的讲,就是awk在输出时,会在每行记录后面增加一个ORS变量所设定的值。& ORS的值只能设定为字符串,默认情况下,ORS的值是\n&seq 5 | awk '{print $0}'
seq 5 | awk 'BEGIN{ORS="a"}{print $0}'
1a2a3a4a5a我们平常用的 print $0 等价于 printf $0 ORS
二、FS 与 OFS 差在哪
& RS是awk用来定义“行”的,那么FS就是awk用来定义“列”的。& 设置变量 FS 与使用 -F 参数是一样的。&echo '1,2' | awk -F , '{print $1}'
echo '1,2' | awk 'BEGIN{FS=","}{print $1}'
1与 RS 类似,FS 同样可以设置为正则表达式&echo '1ab2bc3cd4de5' | awk 'BEGIN{FS="[a-z]+"}{print $1,$2,$5}'
1 2 5FS 有1个特例,就是将FS设置为一个空格,FS=" " ,这也是FS的默认值&1.In the special case that FS is a single space, fields are separated by runs of spaces and/or tabs and/or newlines.此时,awk会将连续的 空格 或 制表符(\t) 或 换行符(\n) 作为列的分隔符& 那么,FS=" " 与 FS="[ \t\n]+" 有区别么???& 答案是肯定的&echo ' 1 2' | awk 'BEGIN{FS=" "}{print $1}'
echo ' 1 2' | awk 'BEGIN{FS="[ \t\n]+"}{print $1}'当FS=" "时,awk会自动去掉行首和行尾的 空格 或 制表符(\t) 或 换行符(\n),但FS="[ \t\n]+"是不会的& 同样,FS也可以设置为空&echo '123' | awk 'BEGIN{FS=""}{print $1,$2}'
1 2当FS被设置为空字符串的时候,awk会将一行记录的每个字符做为单独的一列& 类似的,当我们想以固定的长度来分隔列的时候,可以使用 FIELDWIDTHS 来代替 FS& 例如,一行记录的前3个字符作为第一列,接下来的2个字符作为第二列,接下来的4个字符作为第三列&echo '' | awk 'BEGIN{FIELDWIDTHS="3 2 4"}{print $1,$2,$3}'
123 45 6789
echo '' | awk 'BEGIN{FIELDWIDTHS="3 2 3"}{print $1,$2,$3}'
123 45 678
&echo '' | awk 'BEGIN{FIELDWIDTHS="3 2 5"}{print $1,$2,$3}'
123 45 6789如果定义的长度小于实际的长度,awk会截断,如果大于实际长度,则以实际长度为准。
& 总结下FS的4种情况:& 1) 非空字符串&&&& 以固定字符串作为列分隔符& 2) 正则表达式&&&& 以正则表达式作为列分隔符& 3) 单个空格&&&& 以连续的 空格 或 制表符(\t) 或 换行符(\n)作为列分隔符& 4) 空字符&&&& 以每个字符做为单独的一列
& 接下来我们来看看上节提到的问题:& 当 RS="" 时,会将\n强制加入到FS变量中&cat urfile
awk -v RS="" '{print "#" $0 "#"}' urfile
awk -F "b" -v RS="" '{print $1}' urfile
awk -F "c" -v RS="" '{print $1}' urfile
awk -F "c" -v RS="\n\n+" '{print "#" $1 "#"}' urfile
#如果FS为单个字符,\n始终存在在 FS 中,而 RS="\n\n+" 则不会。
& 了解的 FS ,我们来看看 OFS ,FS是awk读入记录时的列分隔符,OFS则是awk输出时的列分隔符。& 我们平时使用的 print $1,$2 等价于 print $1 OFS $2&echo '1 2' | awk -v OFS="|" '{print $1,$2}'
echo '1 2' | awk -v OFS="|" '{print $1 OFS $2}'
1|2如果一行记录有很多列,同时想改变输出的分隔符,print $1,$2,$3 ... 启不是很麻烦?& 当然有简单的方法:&echo '1 2 3 4 5' | awk -v OFS="|" '{print $0}'
&echo '1 2 3 4 5' | awk -v OFS="|" '{$1=$1;print $0}'
echo '1 2 3 4 5' | awk -v OFS="|" '{NF+=0;print $0}'
1|2|3|4|5为了使OFS的设置生效,需要改变 $0 ,这里我们是对 awk 撒了个小谎& $1=$1 或者 NF+=0, $0 本身的内容实际上没有任何改变,只是为了使 OFS 的设置生效
& 在理解了 RS 和 FS 之后,我们来回顾开始的那句话:“awk是基于行列操作文本的”& 这个说法实际上不是很准确,因为在改变了 RS 后,awk 中的“行”已经不是一般的“行”了& 同样,改变了 FS 后,awk 中的“列”也已经不是一般的“列”了& 因此,准确的应该这样讲:“awk是基于 记录(record) 和 域(field) 操作文本的”
三、0 与 "0" 差在哪
& 我们先来看一个例子:&awk 'BEGIN{if(0) print "true";else print "false"}'
awk 'BEGIN{if("0") print "true";else print "false"}'
true为什么同样是 0 ,结果却不一样?& 其实要解释这个问题,只需要弄清楚awk中的“真”与“假”。& 以下3种情况是“假”,其他情况都为“真”& 1) 数字 0& 2) 空字符串& 3) 未定义的值&&awk 'BEGIN{a=0;if(a) print "true";else print "false"}'
awk 'BEGIN{a="";if(a) print "true";else print "false"}'
awk 'BEGIN{if(a) print "true";else print "false"}'
awk如何去重?&1.awk '! a[$0] ++'在解释之前,我们先要了解awk的一个特性:& awk 会根据语境来给未定义的变量赋初始值&awk 'BEGIN{print a "" 1}'
&awk 'BEGIN{print a + 1}'
1对于未定义的变量,如果要进行字符串操作,会被赋成空字符串 ""& 如果要进行数学运算,会被赋成数字 0
& 现在我们看看上面的代码 ! a[$0] ++ 等价于 if(! a[$0] ++) print $0& 对于首次出现的记录,a[$0]的值是未定义的,由于后面的 ++ 是数学计算,所以a[$0]会被赋值成数字0& 也是由于 ++ 操作符,会先取值,再计算,所以对于第一行记录实际上是if(! 0) print $0& ! 是取反,0 是假,! 0 就是真,那么就会执行后面的 print $0& 对于后面出现的重复记录,a[$0] 经过 ++ 的计算已经变为 1、2、3 。。。& 而 ! 1& ! 2& ! 3 ... 都为假,不会打印。
& 下面我们用黑哥的一段代码来深刻体会一下,用awk打印奇数行:&seq 10 | awk 'i=!i'
阅读(...) 评论()

我要回帖

更多关于 eeepawk 的文章

 

随机推荐