awk过滤文本行

本文介绍了如何使用awk命令去除文本文件中的重复行,并提供了两种不同的awk方案来过滤奇偶行。通过示例代码和测试,展示了awk在文本处理方面的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

res

解析

$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

res

解析

变量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

res

解析

环境变量NR代表当前行号,通过取模运算判断奇偶行

awk中主要的内置变量有:

              ARGC      命令行参数个数

              ARGV      命令行参数数组

              FILENAME  当前输入文件的文件名

              FNR       当前输入文件的当前记录数

              FS        域之间的分隔符

              NF        当前记录中域的个数

              NR        总输入流中的记录数

              RS        记录分隔符, 默认= "\n".

感想

awk功能强大,不仅仅是针对文本行进行处理,可以实现相对复杂的逻辑,功能强大。
慢慢积累。


参考资料

awk从入门到放弃-11
三十分钟学会AWK
夜息:Shell学习笔记(长期更新)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值