Awk 的强大与应用

Awk 语言设计简洁但功能强大,能够在命令行中执行复杂的文本处理操作。


1. 单行转换为双行

需求:将单倍行距的文本转换为双倍行距。

解决方案

awk '{print; print ""}' infile > outfile

说明

  • print:打印当前行。
  • print "":打印空行(即增加行距)。
  • 输入
    Line 1
    Line 2
    
  • 输出
    Line 1
    
    Line 2
    

修正:避免双倍空行

问题:如果原文件已有空行,则会被加倍,导致输出文件中出现多个空行。

awk '{print; if (NF != 0) print ""}' infile > outfile

修正方案

  • 只有当当前行不为空(即 NF != 0)时,才打印额外的空行。

2. 统计文件行数

错误方法

awk 'END {print NR}' infile

替代方案

wc -l infile

说明

  • wc -l 更快、更高效。
  • 结论选择合适的工具,避免滥用 Awk

3. 统计非空行数

问题:如何计算文件中非空行的数量?

解决方案

awk 'NF != 0 {++count} END {print count}' list

说明

  • NF != 0:忽略空行。
  • count:累计非空行数。
  • END {print count}:最终输出非空行数。

4. 计算文件平均大小

需求:计算一组文件的平均大小(以字节为单位)。

方案

ll | awk 'NR!=1 {s+=$5} END {print "Average: " s/(NR-1)}'

说明

  • ll 列出文件信息,第 5 列 是文件大小。
  • NR!=1:跳过 ll 输出的第一行(该行显示磁盘总占用)。
  • s+=$5:累加文件大小。
  • s/(NR-1):计算平均值(因跳过了第一行,故 NR-1)。

示例输入

total 10240
-rw-r--r-- 1 user group 40960 Jan 1 10:00 file1.bmp
-rw-r--r-- 1 user group 38400 Jan 1 10:05 file2.bmp
-rw-r--r-- 1 user group 45056 Jan 1 10:10 file3.bmp

示例输出

Average: 41472

5. 计算 Fibonacci 数列

需求:生成 前 10 个 Fibonacci 数

解决方案

awk 'BEGIN {a=1; b=1; while(++x<=10) {print a; t=a; a=a+b; b=t}; exit}'

说明

  • a=1; b=1:初始化 Fibonacci 数列的前两个数。
  • while(++x<=10):循环 10 次。
  • print a:输出当前 Fibonacci 数。
  • t=a; a=a+b; b=t:更新 Fibonacci 数列。

示例输出

1
2
3
5
8
13
21
34
55
89

总结

任务 Awk 代码
双倍行距 awk '{print; print ""}' infile > outfile
避免双倍空行 awk '{print; if (NF != 0) print ""}' infile > outfile
统计文件行数 wc -l infile
统计非空行数 awk 'NF != 0 {++count} END {print count}' list
计算平均文件大小 `ll
生成 Fibonacci 数列 awk 'BEGIN {a=1; b=1; while(++x<=10) {print a; t=a; a=a+b; b=t}; exit}'

下一章,我们将学习 Awk 的输入处理(File Processing) 🚀

最后修改: 2025年01月30日 星期四 01:28