免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2762 | 回复: 4
打印 上一主题 下一主题

linux下处理文本的问题 awk [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-22 12:11 |只看该作者 |倒序浏览
10可用积分
这个问题可能涉及到awk和sed的使用方法
df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                     136805368   5133064 124610800   4% /
/dev/sda1               101086     10963     84904  12% /boot
tmpfs                   371304         0    371304   0% /dev/shm
如上所示,执行df-k命令后,由于 /dev/mapper/VolGroup00-LogVol00 文件系统名字很长导致换行。
问题有两个:
1,如何使用 awk获得每一行的列数?
2,如何判断当某一行的列数小于指定列数(比如是6列),将其下一行的内容追加到当前行后面?

论坛徽章:
0
2 [报告]
发表于 2009-08-22 12:24 |只看该作者
awk有NR和NF变量,你可以试试看。

论坛徽章:
0
3 [报告]
发表于 2009-08-22 15:38 |只看该作者
declare -i lineNum=`wc -l fsrate |awk '{print $1}'`
echo "total lineNumber is:" $lineNum
declare -i column
declare -i ss
for((i=1;i<=$lineNum;i=i+1))
do
        ss=i
        echo "the line:" $ss
        column=`cat fsrate|awk 'NR==$ss{print NF}'`
        echo "column number is:" $column


done
如上,我想读取fsrate里所有信息并且将每行数据的列数打印出来,但是最后输出的都是0,输出结果如下:
.[root@localhost testawk]# ./test01.sh
total lineNumber is: 5
the line: 1
column number is: 0
the line: 2
column number is: 0
the line: 3
column number is: 0
the line: 4
column number is: 0
the line: 5
column number is: 0

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
4 [报告]
发表于 2009-08-22 15:59 |只看该作者
原帖由 mooyin 于 2009-8-22 15:38 发表
declare -i lineNum=`wc -l fsrate |awk '{print $1}'`
echo "total lineNumber is:" $lineNum
declare -i column
declare -i ss
for((i=1;i


column=`cat fsrate|awk 'NR==$ss{print NF}'`
column=`cat fsrate|awk "NR==$ss{print NF}"`

这种问题应该去shell版问

论坛徽章:
0
5 [报告]
发表于 2009-08-23 12:45 |只看该作者
问题1:可以通过下面的命令来获得每一行的列数df -k|nawk  '{print NF}'
问题2:df -k| nawk  '{if (NF<6) {sign+=NF;if(sign<6)printf("%s",$0)else {sign=0;printf(" %s\n",$0)} ;else printf("%s\n",$0}'
通过这个命令可以判断列数并可以实现若行数不足可以适当补齐。其方法是:首先将数据输入nawk中,它判断每一行的段数;若大于或等于6则输出,若小于6,则设个标志位,同时进行不分行输出,当标志位达到6以上时,可分行输出,并再次将标志位置0.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP