如转载请指明(博客http: yangzhigang cublog cn)。前言:有时我们需要将某个域之后的所有域打印出来,而且每个记录(行)的域的个数也不一定,所以用$4,$5,… $n,… $(NF-1),$NF穷举是不现时的,
如转载请指明“(源自: 博客 http://yangzhigang.cublog.cn)”。

 
前言:
有时我们需要将某个域之后的所有域打印出来,而且每个记录(行)的域的个数也不一定,所以用“$4,$5,…..$n,….$(NF-1),$NF”穷举是不现时的,我经过测试,总结了一下实现的方法,供大家参考。
 
一.利用输出函数printf
// 测试文件内容
[root@cacti tmp]# cat file.txt 
x1 x2 x3
x1 x2 x3 x4 x5
x1 x2 x3 x4 x5 x6
x1 x2 x3 x4 x5 x6 x7 x8
x1 x2 x3 x4 x5 x6 x7
 
[root@cacti tmp]# awk '{for(i=4;i<=NF;i++) printf"%s ",$i} {print ""}' file.txt
 
x4 x5 
x4 x5 x6 
x4 x5 x6 x7 x8 
x4 x5 x6 x7
[root@cacti tmp]# awk '{for (i=4;i<=NF;i++) {printf $i" "}printf "\n"}' file.txt
 
x4 x5 
x4 x5 x6 
x4 x5 x6 x7 x8 
x4 x5 x6 x7
 
问题:
1) 在NF不够4个的记录(行),将会打印出一个空行;
2) 在输出的结果中,每行结尾多了一个空格;
 
下面两种命令,分别对上面两个命令加了NF>4的判断,结果是一致的,解决了上面的第一个问题:“在NF不够4个的记录(行),将会打印出一个空行;”。
[root@cacti tmp]# awk '{for(i=4;i<=NF;i++) printf"%s ",$i};NF>4 {print ""}' file.txt 
x4 x5 
x4 x5 x6 
x4 x5 x6 x7 x8 
x4 x5 x6 x7
[root@cacti tmp]# awk 'NF>4 {for (i=4;i<=NF;i++) {printf $i" "}printf "\n"}' file.txt 
x4 x5 
x4 x5 x6 
x4 x5 x6 x7 x8 
x4 x5 x6 x7
 
二.利用字符串函数index和substr
// 测试文件内容
[root@cacti tmp]# cat file.txt 
x1 x2 x3
x1 x2 x3 x4 x5
x1 x2 x3 x4 x5 x6
x1 x2 x3 x4 x5 x6 x7 x8
x1 x2 x3 x4 x5 x6 x7
[root@cacti tmp]# cat file.txt |awk '{a=index($0,$4);print substr($0,a)}'
x1 x2 x3
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x5 x6 x7
 
可以发现,执行上面这个命令时,在NF不够4个的记录(行),将会打印出整行记录;为解决这个问题,可以像上文所采用的方法,加上“NF>4”,如下:
[root@cacti tmp]# cat file.txt |awk 'NF>4 {a=index($0,$4);print substr($0,a)}'
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x5 x6 x7
 
这种方法似乎很完美,但是分析实现原理,可以发现,本方法是通过分析出$4这个字段的字串在$0(整个记录)中第一次出现的位置,记数为a,之后再截取a之后的字串,并打印。那么,如果$4的字串在之前就出次过,则a的数值就是前面的出现的位置了,结果就会是错误的,为解决这个问题,可以将$4替换一下,再定位,测试如下:
// 测试文件内容
[root@cacti tmp]# cat filexx.txt 
x1 x2 x3
x1 x4 x3 x4 x5
x1 x4 x4 x4 x5 x6
x4 x2 x3 x4 x5 x6 x7 x8
x1 x2 x3 x4 x4 x6 x7
(本文件,可以发现$4的字串:x4,在2,3,4,5行,在$4之前的域都有出现过与之相同的字串:x4)
//下面是用上面的方法,结果显然有误的,是将以x4开始的域之后的所有域全打印出来了。
[root@cacti tmp]# cat filexx.txt |awk 'NF>4 {a=index($0,$4);print substr($0,a)}'
x4 x3 x4 x5
x4 x4 x4 x5 x6
x4 x2 x3 x4 x5 x6 x7 x8
x4 x4 x6 x7
 
//对$4重新赋值,在$4前加个“z”,以区分之前域于之相同的字串
[root@cacti tmp]# cat filexx.txt |awk 'NF>4 {$4="z"$4;a=index($0,$4);print substr($0,a)}'
zx4 x5
zx4 x5 x6
zx4 x5 x6 x7 x8
zx4 x4 x6 x7
 
//将上个命令中加的字串“z”过滤掉,得到想要的结果
[root@cacti tmp]# cat filexx.txt |awk 'NF>4 {$4="n"$4;a=index($0,$4);print substr($0,a+1)}'
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x4 x6 x7
 
//指定分隔符为一个空格,指定(多个)分隔符时,要写在方括号中,此方法对某个字段(如yang  zhi  gang为表示名字的字段)中有多个空格很有用。
[root@cacti tmp]# cat filexx.txt |awk 'BIGIN{FS="[ ]"} NF>4 {$4="n"$4;a=index($0,$4);print substr($0,a+1)}'
x4 x5
x4 x5 x6
x4 x5 x6 x7 x8
x4 x4 x6 x7
 
三.利用域值替换
    就是将某个(些)域替换成空值,如去除第一个域为:awk '{ $1=""; print $0 }' file.in
// 测试文件内容
[root@cacti tmp]# cat file.txt 
x1 x2 x3
x1 x2 x3 x4 x5
x1 x2 x3 x4 x5 x6
x1 x2 x3 x4 x5 x6 x7 x8
x1 x2 x3 x4 x5 x6 x7
 
//前3个域用字母a替换
[root@cacti tmp]# awk '{ for(i=1;i<=3;i++){$i="a"}; print $0 }' file.txt 
a a a
a a a x4 x5
a a a x4 x5 x6
a a a x4 x5 x6 x7 x8
a a a x4 x5 x6 x7
 
//前3个域用空格替换
[root@cacti tmp]# awk '{ for(i=1;i<=3;i++){$i=""}; print $0 }' file.txt 
  
   x4 x5
   x4 x5 x6
   x4 x5 x6 x7 x8
   x4 x5 x6 x7
问题:
1) 在NF不够4个的记录(行),将会打印出一个空行;
2) 在输出的结果中,去除的域会用空格来代替
 
// 去除上面命令输出的空行,但输出结果前端会有空格
[root@cacti tmp]# awk 'NF>4 { for(i=1;i<=3;i++){$i=""}; print $0 }' file.txt
   x4 x5
   x4 x5 x6
   x4 x5 x6 x7 x8
   x4 x5 x6 x7
 
总结:
   本文介绍了三种方法来解决AWK“只打印第N个域之后的所有域”的问题。
   第一和第三种方法会出现输出结果后端或前端加空格的情况,但这可能不会影响你后绪的操作,可以结合管道再处理。
   根据你的需要选择合适的方法吧。

AWK只打印某个域后的所有域的更多相关文章

  1. excel怎么只打印某页?excel怎么只打印某几页

    有时候我们需要打印的excel文件,内容较多有好几页,而我们只需要打印里面的部分内容,为了减少纸张.碳粉的浪费,我们怎样精准打印某页或某几页呢?   工具/原料   Excel / WPS软件 方法/ ...

  2. 关闭rdlc报表打印预览后,关闭客户端,抛出异常“发生了应用程序级的异常 将退出”

    问题:关闭rdlc报表打印预览后,关闭客户端,抛出异常“发生了应用程序级的异常 将退出” 办法:在容纳ReportViewer的窗体后台代码中,添加如下代码即可 protected override ...

  3. log4j配置只打印指定jar或包的DEBUG信息

    有的时候查问题的时候需要打印第三方jar里面的debug信息,假如全部jar都打印的话日志文件会很大,这个时候可以配置log4j只打印指定jar的debug信息或者包,同时输出到了一个新的文件中. 比 ...

  4. SQLServer加入域后无法远程连接

    如果您更改的SQLServer的远程连接端口(默认1433),加入域后,防火墙会把自定义规则都禁用掉 所以,你得进防火墙,查看,是否防火墙关闭了,我的就是关闭了,找了半天原因

  5. NodeJs 设置跨域后页面全部变成了源码在浏览器上显示

    百度搜索跨域后得到 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin" ...

  6. lua 写逻辑打印log时,打印到一半后停止不再打印,程序停止

    问题描述:ubuntu下用lua开发游戏电子邮件模块,自己测试时向用户推送100封,而用户最多只能有50封.这是调用sysdelete删除一些邮件.当打印log时,打印到一半后程序中途停止.将打印lo ...

  7. .NET Framework 3.5 无法安装以下功能 安装错误:0x800F0906(客户端加域后出现)

    问题:安装错误:0x800F0906    系统安装并加域后,在安装用友软件时提示没有.net 3.5 系统为win10 但是,点击确定后,却出现了这样的错误.如下: 点击下载并安装此功能,出现了这样 ...

  8. excel中如何设置只打印第一页

    在打印表格时,怎样设置只打印第一页呢,操作很简单,下面,小编说下操作方法.   方法/步骤     打开要打印的工作表, 再点击“文件”   弹出的页面中,在左侧这里,点击“打印”   在右边弹出与打 ...

  9. nginx处理vue打包文件后的跨域问题

    起因 在vue文件打包后,项目脱离了vue配置的反向代理配置,还是会报跨域的错误,或者直接打不开本地文件, 但是此刻我们想打开打包后的文件,测试一下文件有没有错误,因为经常会存在开发阶段没有问题,打包 ...

随机推荐

  1. GDB打印STL容器内容

    GDB调试不能打印stl容器内容,下载此文件,将之保存为~/.gdbinit就可以使用打印命令了. 打印list用plist命令,打印vector用pvector,依此类推. (gdb) pvecto ...

  2. 对Get-Content参数-readcount的解释

    绝大多数用户更关心最新的日志,下面给出一个简单的例子演示从一个文本日志中获取最后的某几行文本行:   # 显示windowsupdate.log 文件的最新5行日志 $logs = Get-Conte ...

  3. Mac 配置环境变量

    系统:mac OS 10.10.3  or later 1.如果不能使用一些常用终端命令,如ls,open.可能是环境变量配置不当导致的.尤其是手动修改 输入以下命令: export PATH=/us ...

  4. 【转】移动Web单页应用开发实践——页面结构化

    1. 前言 在开发面向现代智能手机的移动Web应用的时候,无法避免一个事实,就是需要开发单页应用(Single Page WebApp).对于不同的系统需求,单页应用的粒度会不同,可能是整个系统都使用 ...

  5. 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)

    最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口 ...

  6. poj 3253 初涉二叉堆 模板题

    这道题很久以前就做过了 当时是百度学习了优先队列 后来发现其实还有个用sort的办法 就是默认sort排序后 a[i]+=a[i-1] 然后sort(a+i,a+i+n) (大概可以这样...答案忘了 ...

  7. Apache Spark源码走读之22 -- 浅谈mllib中线性回归的算法实现

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本文简要描述线性回归算法在Spark MLLib中的具体实现,涉及线性回归算法本身及线性回归并行处理的理论基础,然后对代码实现部分进行走读. 线性回归模型 ...

  8. http响应报文和http请求报文 详细信息

    tomcat项目本身的jar包

  9. 8添加一些样式:开始学习CSS

    CSS中简单的表达式,成为规则.一个典型的规则包括一个选择符.若干属性和属性值. 1.在XHTML中直接添加CSS样式,必须在<head>元素里添加样式开始和结束标记.(但这未必是最好的方 ...

  10. Machine Learning in Action -- FP-growth

    要解决的问题,频繁项集 最暴力的方法,就是遍历所有的项集组合,当然计算量过大 最典型的算法apriori, 算法核心思想,当一个集合不是频繁项集,那么它的超集也一定不是频繁项集 这个结论是很明显的,基 ...