shell 打印偶数行奇数行
2015-09-08 12:30
706 查看
打印行号 awk
'{print NR":"$0}'
打印偶数行、奇数行
(1) awk '{print $0 > NR%2}' file
(2) sed -n '1~2p' file
sed -n '2~2p' file
(3) sed -n 'p;n' file
sed -n 'n;p' file
(4) 1,awk 'NR%2==1' file
2,awk 'NR%2==0' file
(5) 1.awk 'NR%2' file
2.awk '!(NR%2)' file
(6) 1.awk 'i=!i' file
2.awk '!(i=!i)' file
解释:
awk 'var=xx'应该说等价于awk 'xx{print}{var=xx}'
awk 'i=!i' == > awk '!i{print}{i=!i}
line 1: !0{print}{i=!0}==> {print;i=1}
line 2: !1{print}{i=!1}==> {i=0}
line 3: !0{print}{i=!0}==> {print;i=1}
sed '1d;n;d' status.txt
sed -n 'n;p' status.txt
sed -n '0~2p' status.txt
awk '!(NR%2)' status.txt
awk 'i++%2' status.txt
awk '!(i=i?0:1)' status.txt
awk '!(i=!i)' status.txt
[root@sgzhang /]# cat
-n tt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff
[root@sgzhang /]# cat -n tt |awk NR%2==0
2 bbb
4 ddd
6 fff
[root@sgzhang /]# cat -n tt |awk NR%2==1
1 aaa
3 ccc
5 eee
[root@sgzhang /]# cat -n tt |sed -n 'p;n'
1 aaa
3 ccc
5 eee
[root@sgzhang /]# cat -n tt |sed -n 'n;p'
2 bbb
4 ddd
6 fff
$ seq 6 | awk 'NR%2'
1
3
5
$ seq 6 | awk '!(NR%2)'
2
4
6
$ seq 6 | awk '++i%2'
1
3
5
$ seq 6 | awk 'i++%2'
2
4
6
$ seq 6 | awk 'i=!i'
1
3
5
$ seq 6 | awk -vi=1 'i=!i'
2
4
6
$ seq 6 | sed -n 'N;P'
1
3
5
$ seq 6 | sed -n 'n;p'
2
4
6
一. 行距:
1. 每行间加一个空行
awk '1; { print "" }' filname.ext #输出当前行,在输出一个空行
awk '1 { print } { print "" }' filname.ext
awk '{ print } { print "" }' filname.ext
2. 1的另外一种实现方法:
awk 'BEGIN { ORS="\n\n" }; 1' filname.ext #预先设置每一行的分隔符号为两个换行;你可以尝试把ORS设置为其他的看看效果如何
3. 仅输出非空行,并每行间在加一个空行
awk 'NF { print $0 "\n" }' filname.ext #NF表示当前行的字段数,$0表示当前行,最后再加一个换行
4. 双倍行距;没行间两个空行
awk '1; { print "\n" }' filname.ext #默认输出后会换行的,输出\n,则会输出两个空白行
等同于:
awk '{ print; print "\n" }' filname.ext
5. 显示当前行在所在文件中的行号
awk '{ print FNR "\t" $0 }' filname.ext#FNR,表示当前行在文件中的行号
6. 显示当前行在本次处理过程中的行号
awk '{ print NR "\t" $0 }' filname.ext #NR,表示当前行在本次处理过程中的行号
小疑问:为啥有FNR和NR的差别呢?效果不都是一样么? 如果你给如:filname1.ext filname2.ext,你就会看到差别了。原来:FNR,是每个文件中的,换了一个文件,会归零;而NR则每个文件会累加起来的
7. 使用简单样式来输出
awk '{ printf("] : %s\n", NR, $0) }' filname.ext
#行号占用5位,不足补空格
8. 显示非空行
awk 'NF { $0=++a " :" $0 }; { print }' filname.ext
#NF前面说了,表示当前行的行号,此处用他作为条件,如果是空行,则NF为0,跳过;否则,用动态变量a存储非空行的数目
9. 计算行数:效果类似wc -l
awk 'END { print NR }' filname.ext #END表示每行都处理完了后,在执行,此时NR就是最后一行的行号,也就是总的行数了。
10. 计算每一行的和
awk '{ s = 0; for (i = 1; i <= NF; i++) s = s+$i; print
s }' filname.ext
#s用作每行和的累加,从1到NF(每行总的字段数),依次累加
11. 计算文件中所有字段的和
awk '{ for (i = 1; i <= NF; i++) s = s+$i }; END { print
s }' filname.ext
#s用作总和的累加,每行都处理完成了,再输出s;注意和10对比,此处没有每行清零,所以累加了。没有设置的变量,默认为空,但是会根据上下文数值计算情况自动变为0
12. 将每个字段用其绝对值代替
13. 计算文件中总的字段和(例如计算单词数)
14. 计算匹配指定信息的总行数
15. 找到文件中每行第一个字段中,最大的数,以及其所在的行
16. 显示当前行的字段数,并输出当前行
17. 显示每行最后一个字段的内容
18. 显示最后一行的最后一个字段
19. 显示字段数小于4的行
20. 显示每行的最后一个字段小于4的行
'{print NR":"$0}'
打印偶数行、奇数行
(1) awk '{print $0 > NR%2}' file
(2) sed -n '1~2p' file
sed -n '2~2p' file
(3) sed -n 'p;n' file
sed -n 'n;p' file
(4) 1,awk 'NR%2==1' file
2,awk 'NR%2==0' file
(5) 1.awk 'NR%2' file
2.awk '!(NR%2)' file
(6) 1.awk 'i=!i' file
2.awk '!(i=!i)' file
解释:
awk 'var=xx'应该说等价于awk 'xx{print}{var=xx}'
awk 'i=!i' == > awk '!i{print}{i=!i}
line 1: !0{print}{i=!0}==> {print;i=1}
line 2: !1{print}{i=!1}==> {i=0}
line 3: !0{print}{i=!0}==> {print;i=1}
1.awk 'NR%2==1' file / /显示奇数行 2.sed -n '1,$n;p' file / /显示偶数行 3.sed -n '1,$p;n' file / /显示奇数行 4.奇数行:sed '2~2d' file / /显示奇数行 5.偶数行:sed '1~2d' file/ /显示偶数行
sed '1d;n;d' status.txt
sed -n 'n;p' status.txt
sed -n '0~2p' status.txt
awk '!(NR%2)' status.txt
awk 'i++%2' status.txt
awk '!(i=i?0:1)' status.txt
awk '!(i=!i)' status.txt
[root@sgzhang /]# cat
-n tt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff
[root@sgzhang /]# cat -n tt |awk NR%2==0
2 bbb
4 ddd
6 fff
[root@sgzhang /]# cat -n tt |awk NR%2==1
1 aaa
3 ccc
5 eee
[root@sgzhang /]# cat -n tt |sed -n 'p;n'
1 aaa
3 ccc
5 eee
[root@sgzhang /]# cat -n tt |sed -n 'n;p'
2 bbb
4 ddd
6 fff
$ seq 6 | awk 'NR%2'
1
3
5
$ seq 6 | awk '!(NR%2)'
2
4
6
$ seq 6 | awk '++i%2'
1
3
5
$ seq 6 | awk 'i++%2'
2
4
6
$ seq 6 | awk 'i=!i'
1
3
5
$ seq 6 | awk -vi=1 'i=!i'
2
4
6
$ seq 6 | sed -n 'N;P'
1
3
5
$ seq 6 | sed -n 'n;p'
2
4
6
一. 行距:
1. 每行间加一个空行
awk '1; { print "" }' filname.ext #输出当前行,在输出一个空行
awk '1 { print } { print "" }' filname.ext
awk '{ print } { print "" }' filname.ext
2. 1的另外一种实现方法:
awk 'BEGIN { ORS="\n\n" }; 1' filname.ext #预先设置每一行的分隔符号为两个换行;你可以尝试把ORS设置为其他的看看效果如何
3. 仅输出非空行,并每行间在加一个空行
awk 'NF { print $0 "\n" }' filname.ext #NF表示当前行的字段数,$0表示当前行,最后再加一个换行
4. 双倍行距;没行间两个空行
awk '1; { print "\n" }' filname.ext #默认输出后会换行的,输出\n,则会输出两个空白行
等同于:
awk '{ print; print "\n" }' filname.ext
5. 显示当前行在所在文件中的行号
awk '{ print FNR "\t" $0 }' filname.ext#FNR,表示当前行在文件中的行号
6. 显示当前行在本次处理过程中的行号
awk '{ print NR "\t" $0 }' filname.ext #NR,表示当前行在本次处理过程中的行号
小疑问:为啥有FNR和NR的差别呢?效果不都是一样么? 如果你给如:filname1.ext filname2.ext,你就会看到差别了。原来:FNR,是每个文件中的,换了一个文件,会归零;而NR则每个文件会累加起来的
7. 使用简单样式来输出
awk '{ printf("] : %s\n", NR, $0) }' filname.ext
#行号占用5位,不足补空格
8. 显示非空行
awk 'NF { $0=++a " :" $0 }; { print }' filname.ext
#NF前面说了,表示当前行的行号,此处用他作为条件,如果是空行,则NF为0,跳过;否则,用动态变量a存储非空行的数目
9. 计算行数:效果类似wc -l
awk 'END { print NR }' filname.ext #END表示每行都处理完了后,在执行,此时NR就是最后一行的行号,也就是总的行数了。
10. 计算每一行的和
awk '{ s = 0; for (i = 1; i <= NF; i++) s = s+$i; print
s }' filname.ext
#s用作每行和的累加,从1到NF(每行总的字段数),依次累加
11. 计算文件中所有字段的和
awk '{ for (i = 1; i <= NF; i++) s = s+$i }; END { print
s }' filname.ext
#s用作总和的累加,每行都处理完成了,再输出s;注意和10对比,此处没有每行清零,所以累加了。没有设置的变量,默认为空,但是会根据上下文数值计算情况自动变为0
12. 将每个字段用其绝对值代替
awk '{ for (i = 1; i <= NF; i++) if ($i < 0) $i = -$i; print }' filname.ext #$i表示当前行中的字段,$0表示当前行,可以改变$i的值 |
awk '{ total = total + NF }; END { print total }' filname.ext |
awk '/Linux/ { n++ }; END { print n+0 }' filname.ext |
awk '$1 > max { max=$1; maxline=$0 }; END { print max, maxline }' filname.ext #用max存储最大的数,maxline存储最大数所在的行,并在最后输出 |
awk '{ print NF ":" $0 } ' filname.ext |
awk '{ print $NF }' filname.ext #NF表示当前行的字段数,例如为3,则$NF,就是$3,也就是第三个字段了 |
awk '{ field = $NF }; END { print field }' filname.ext #每行处理没有输出,尽在最后输出,field作为每行的最后一行的暂存变量 |
awk 'NF < 4' filname.ext #{}以外的内容,作为条件,没有{},则默认输出当前行 |
awk '$NF < 4' filname.ext #注意和19对比 |
相关文章推荐
- shell脚本 函数传递参数
- shell主要命令使用总结
- shell中exec和system解析
- shell脚本语法总结
- profile和bash
- shell条件测试
- Shell获取文件的文件名和扩展名的例子
- linux shell 种类
- shell中if条件字符串、数字 [[ ]]和[ ]区别
- shell中第一行#!/bin/bash的作用
- linux bash history
- shell脚本的多种执行方法及调试方法
- 如何将PHP作为Shell脚本语言使用
- Bash中的特殊字符
- linux shell脚本:在脚本中实现读取键盘输入,根据输入判断下一步的分支
- 使用 shell 加载配置文件
- shell脚本初学 遍历目录下的文件
- shell如何向python传递参数,shell如何接受python的返回值
- shell 获得本机IP和free端口
- shell脚本 for循环实现文件和目录遍历