使用awk和sed获取文件奇偶数行的方法总结

测试文件test.file

[root@localhost ~]# cat test.file
111111111111111
222222222222222
333333333333333
444444444444444
555555555555555
666666666666666
777777777777777
888888888888888
999999999999999
1010101010101010

1) 打印奇数行的方法

[root@localhost ~]# sed -n ‘1~2p‘ test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999

[root@localhost ~]# sed -n ‘p;n‘ test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999

[root@localhost ~]# sed -n ‘1,$p;n‘ test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999

[root@localhost ~]# sed ‘2~2d‘ test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999

[root@localhost ~]# awk ‘NR%2==1‘ test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999

[root@localhost ~]# awk ‘NR%2‘ test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999

[root@localhost ~]# awk ‘i=!i‘ test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999

2) 打印偶数行的方法

[root@localhost ~]# sed -n ‘2~2p‘ test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010

[root@localhost ~]# sed -n ‘n;p‘ test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010

[root@localhost ~]# sed -n ‘1,$n;p‘ test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010

[root@localhost ~]# sed ‘1~2d‘ test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010

[root@localhost ~]# awk ‘NR%2==0‘ test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010

[root@localhost ~]# awk ‘!(NR%2)‘ test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010

[root@localhost ~]# awk ‘!(i=!i)‘ test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010

打印奇偶行的方法总结

sed -n ‘1~2p‘ test.file   打印奇数行
sed -n ‘2~2p‘ test.file   打印偶数行

sed -n ‘p;n‘ test.file    打印奇数行
sed -n ‘n;p‘ test.file    打印偶数行

sed -n ‘1,$p;n‘ test.file 打印奇数行
sed -n ‘1,$n;p‘ test.file 打印偶数行

sed ‘2~2d‘ test.file      打印奇数行
sed ‘1~2d‘ test.file      打印偶数行

awk ‘NR%2==1‘ test.file   打印奇数行
awk ‘NR%2==0‘ test.file   打印偶数行

awk ‘NR%2‘ test.file      打印奇数行
awk ‘!(NR%2)‘ test.file   打印偶数行

awk ‘i=!i‘ test.file      打印奇数行
awk ‘!(i=!i)‘ test.file   打印偶数行

其他相关正则取值说明

1) 打印行号和内容
[root@localhost ~]# awk ‘{print NR":"$0}‘ test.file
1:111111111111111
2:222222222222222
3:333333333333333
4:444444444444444
5:555555555555555
6:666666666666666
7:777777777777777
8:888888888888888
9:999999999999999
10:1010101010101010

2) 每行间加一个空行
[root@localhost ~]# awk ‘1; { print "" }‘ test.file
111111111111111

222222222222222

333333333333333

444444444444444

555555555555555

666666666666666

777777777777777

888888888888888

999999999999999

1010101010101010

[root@localhost ~]# awk ‘1 { print } { print "" }‘ test.file
111111111111111

222222222222222

333333333333333

444444444444444

555555555555555

666666666666666

777777777777777

888888888888888

999999999999999

1010101010101010

[root@localhost ~]# awk ‘{ print } { print "" }‘ test.file
111111111111111

222222222222222

333333333333333

444444444444444

555555555555555

666666666666666

777777777777777

888888888888888

999999999999999

1010101010101010

[root@localhost ~]# awk ‘BEGIN { ORS="\n\n" }; 1‘ test.file
111111111111111

222222222222222

333333333333333

444444444444444

555555555555555

666666666666666

777777777777777

888888888888888

999999999999999

1010101010101010

3) 仅输出非空行,并每行间在加一个空行
# awk ‘NF { print $0 "\n" }‘ test.file
NF表示当前行的字段数,$0表示当前行,最后再加一个换行

4) 双倍行距;没行间两个空行
默认输出后会换行的,输出\n,则会输出两个空白行
[root@localhost ~]# awk ‘1; { print "\n" }‘ test.file
111111111111111

222222222222222

333333333333333

444444444444444

555555555555555

666666666666666

777777777777777

888888888888888

999999999999999

1010101010101010

[root@localhost ~]# awk ‘{ print; print "\n" }‘ test.file
111111111111111

222222222222222

333333333333333

444444444444444

555555555555555

666666666666666

777777777777777

888888888888888

999999999999999

1010101010101010

5) 显示当前行在所在文件中的行号
FNR,表示当前行在文件中的行号
[root@localhost ~]# awk ‘{ print FNR "\t" $0 }‘ test.file
1       111111111111111
2       222222222222222
3       333333333333333
4       444444444444444
5       555555555555555
6       666666666666666
7       777777777777777
8       888888888888888
9       999999999999999
10      1010101010101010

6) 显示当前行在本次处理过程中的行号
NR,表示当前行在本次处理过程中的行号
[root@localhost ~]# awk ‘{ print NR "\t" $0 }‘ test.file
1       111111111111111
2       222222222222222
3       333333333333333
4       444444444444444
5       555555555555555
6       666666666666666
7       777777777777777
8       888888888888888
9       999999999999999
10      1010101010101010

为啥有FNR和NR的差别呢?效果不都是一样么? 
如果使用两个文件filname1.ext  filname2.ext,则就会看到差别了。
原来:FNR,是每个文件中的,换了一个文件,会归零;而NR则每个文件会累加起来的

7) 使用简单样式来输出
下面表示"行号占用5位,不足补空格"
[root@localhost ~]# awk ‘{ printf("] : %s\n", NR, $0) }‘ test.file
] : 1
] : 2
] : 3
] : 4
] : 5
] : 6
] : 7
] : 8
] : 9
] : 10

8) 显示非空行
# awk ‘NF { $0=++a " :" $0 }; { print }‘   test.file
NF前面说了,表示当前行的行号,此处用他作为条件,如果是空行,则NF为0,跳过;否则,用动态变量a存储非空行的数目

9) 计算行数:效果类似wc -l
END表示每行都处理完了后,在执行,此时NR就是最后一行的行号,也就是总的行数了。
#awk ‘END { print NR }‘   test.file    

10) 计算每一行的和
s用作每行和的累加,从1到NF(每行总的字段数),依次累加
# awk ‘{ s = 0; for (i = 1; i <= NF; i++) s = s+$i; print s }‘   test.file

11)  计算文件中所有字段的和
s用作总和的累加,每行都处理完成了,再输出s;注意和10对比,此处没有每行清零,所以累加了。没有设置的变量,默认为空,
但是会根据上下文数值计算情况自动变为0
# awk ‘{ for (i = 1; i <= NF; i++) s = s+$i }; END { print s }‘   test.file

12) 将每个字段用其绝对值代替
$i表示当前行中的字段,$0表示当前行,可以改变$i的值
# awk ‘{ for (i = 1; i <= NF; i++) if ($i < 0) $i = -$i; print }‘  test.file

13)  计算文件中总的字段和(例如计算单词数)
# awk ‘{ total = total + NF }; END { print total }‘  test.file

14) 计算匹配指定信息的总行数
# awk ‘/Linux/ { n++ }; END { print n+0 }‘  test.file

15) 找到文件中每行第一个字段中,最大的数,以及其所在的行
用max存储最大的数,maxline存储最大数所在的行,并在最后输出
# awk ‘$1 > max { max=$1; maxline=$0 }; END { print max, maxline }‘  test.file

16) 显示当前行的字段数,并输出当前行
# awk ‘{ print NF ":" $0 } ‘  test.file

17) 显示每行最后一个字段的内容
# awk ‘{ print $NF }‘  test.file   #NF表示当前行的字段数,例如为3,则$NF,就是$3,也就是第三个字段了

18) 显示最后一行的最后一个字段
每行处理没有输出,尽在最后输出,field作为每行的最后一行的暂存变量
# awk ‘{ field = $NF }; END { print field }‘  test.file

19) 显示字段数小于4的行
# awk ‘NF < 4‘  test.file   

20) 显示每行的最后一个字段小于4的行
# awk ‘$NF < 4‘  test.file  

shell脚本,实现奇数行等于偶数行 

[root@localhost ~]# cat kevin.file
aa
11
bb
22
cc
33
dd
44

使用awk命令可以这样实现:
[root@localhost ~]# awk ‘NR%2==0{print a"="$0}{a=$0}‘ kevin.file
aa=11
bb=22
cc=33
dd=44

使用shell脚本可以这样实现:
[root@localhost ~]# cat kevin.sh
#!/bin/bash
n=0
for i in $(cat /root/kevin.file)
do
  n=$(($n+1))
    [ $((n%2)) -eq 1 ] && echo -n $i=
    [ $((n%2)) -eq 0 ] && echo $i
done

[root@localhost ~]# sh kevin.sh
aa=11
bb=22
cc=33
dd=44

原文地址:https://www.cnblogs.com/kevingrace/p/10540374.html

时间: 2024-10-05 00:05:55

使用awk和sed获取文件奇偶数行的方法总结的相关文章

CSS3:nth-child()伪类选择器,Table表格奇偶数行定义样式

转自爱设计 原文链接http://www.dangshopex.com/jishufenxiang/WEBkaifajishu/8653.html CSS3的强大,让人惊叹,人们在惊喜之余,又不得不为其艰难的道路感到可惜:好的标准只有得到行业浏览器的良好支持才算得上“标准”.CSS3标 准已提出数年,但是目前能实现她的浏览器并不多,虽然部分浏览器能实现部分规范,但这又有什么用呢?面对更多的兼容性问题,CSSer们只有望洋轻叹.虽 然如此,但有前瞻性的我们,又怎能停步不前呢?今天我们就来“前瞻”一

阿里云中获取文件及目录列表的方法

1 获取指定bucket下的文件列表(php-sdk 示例) $prefix = 'dir/'; $delimiter = '/'; $nextMarker = ''; $maxkeys = 30; while (true) { $options = array( 'delimiter' => $delimiter, 'prefix' => $prefix, 'max-keys' => $maxkeys, 'marker' => $nextMarker, ); var_dump($

php获取文件mime类型Fileinfo等方法

前几天写到使用wordpress xmlrpc api远程发布文章,如果本地服务器的文章库里某一篇待发表的wordpress文章包含图片文件时,就会使用到WordPress上传文件的API metaWeblog.newMediaObject,该api需要提供文件的mime 类型.php如 何获取文件(图片)的mime 类型呢?最初远方博客使用php mime_content_type()函数,使用开发用的ubuntu server lamp的默认配置测试后完全支持,返回了正确的文件mime ty

awk、sed处理文件的简单例子

这个东西,如果不经常操作,真心过一段时间就忘干净..要掌握熟练,就要多练习,这没什么可说的. 酷壳网的两篇文章不错的哈: sed: http://coolshell.cn/articles/9104.html awk: http://coolshell.cn/articles/9070.html 慕课网视频资料: shell编程之正则表达式:http://www.imooc.com/learn/378 菜鸟学习,建议反复练习和反复看这几个资料.

C# 根据包含文件的路径和文件的名称的字符串获取文件名称的几种方法

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 C# 截取带路径的文件名字,扩展名,等等 的几种方法 C#对磁盘IO操作的时候,经常会用到这些,路径,文件,文件名字,文件扩展名. 之前,经常用切割字符串来实现, 可是经常会弄错. 尤其是启始位置,多少个字节,经常弄晕. 下面这种方法貌似比较简

iOS中获取文件路径的几种方法

iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app 目录:这是应用程序的程序包目录,

awk与sed:一个关于多行处理的例子

前几天在CSDN上看到一个帖子http://bbs.csdn.net/topics/390848841,楼主贴了下面的问题: 例: 12345 67890 1234567890 123 4567890 如何能把上面数据转换成 1234567890 1234567890 1234567890 看了几位网友的回复,觉得还是挺有意思,也收获了一些知识,因为部分网友只给出了解决方法,没有解释下,我根据自己的理解,对几个答案解释下(不一定准确,错误之处请指正) 我认为错的答案 1    首先楼主给出了一个

Windows下获取文件的md5码的方法

1.certutil 命令简介 本来想找一个工具 算一个文件的md5 或者是sha 值来着. 找到一个说法是 可以使用 windows 自带的命令行来处理 具体命令 certutil -hashfile 容器与容器云(第2版).pdf sha512 相关的命令帮助为: >certutil -hashfile -? 用法: CertUtil [选项] -hashfile InFile [HashAlgorithm] 通过文件生成并显示加密哈希 选项: -Unicode -- 以 Unicode 编

如何使用sed在文件中确定行插入带有变量的字符串

背景 最近在研究一键部署,其中有一个环节,是要使用shell脚本放开防火墙的某个端口号 方法 使用shell中常见的插入文本命令:sed 问题 如果已经预知要打开的端口号如6379,可以使用:sed -i '10a\-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT' /etc/sysconfig/iptables 来实现 但是目前的端口号为未知变量$port,如果使用:sed -i '10a\-A INPUT -