awk 去除重复行
编码
awk.sh
#!/bin/bash
awk '!a[$0]++' $1
测试
测试文本
passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
解析
$1
代表传入给脚本的参数。
$0
代表匹配到的每一行,a[$0]
代表以$0
为key的数组元素,
不存在时此数组元素时,自动建立此key对应的数组元素
对第一次遇到的行,a[$0]
都为0,代表假.
!a[$0]++
中,条件判断!a[$0]
为假。执行后以当前行$0
为key的 数组元素a[$0]
值为1。
如果遇到重复的行,a[$0]
不为0,!a[$0]
为假,不输出此重复的行
awk过滤奇/偶数行
方案一
编码
odd.sh
#!/bin/bash
awk 'i=!i {print $0}' $1
测试
测试文本
passwd
1 root:x:0:0:root:/root:/bin/bash
2 root:x:0:0:root:/root:/bin/bash
3 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
4 bin:x:2:2:bin:/bin:/usr/sbin/nologin
5 sys:x:3:3:sys:/dev:/usr/sbin/nologin
解析
变量i的初始值为0,!i为1,将此值赋给i,此时i=1,输出此行
接着i值交替改变, 达到控制效果
方案二
编码
even.sh
#!/bin/bash
awk 'NR%2==0 {print $0}' $1
测试
测试文本
passwd
1 root:x:0:0:root:/root:/bin/bash
2 root:x:0:0:root:/root:/bin/bash
3 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
4 bin:x:2:2:bin:/bin:/usr/sbin/nologin
5 sys:x:3:3:sys:/dev:/usr/sbin/nologin
解析
环境变量NR
代表当前行号,通过取模运算判断奇偶行
awk中主要的内置变量有:
ARGC 命令行参数个数
ARGV 命令行参数数组
FILENAME 当前输入文件的文件名
FNR 当前输入文件的当前记录数
FS 域之间的分隔符
NF 当前记录中域的个数
NR 总输入流中的记录数
RS 记录分隔符, 默认= "\n".
感想
awk功能强大,不仅仅是针对文本行进行处理,可以实现相对复杂的逻辑,功能强大。
慢慢积累。