给文本文件加行号的几种语言实现

文本文件 cc.c 内容如下:

#include <stdio.h>

int main (int argc, char * argv[])
{
     printf("hello world.\n");
     return 0;
}
输出为:
0001:  #include <stdio.h>
0002:
0003:  int main (int argc, char * argv[])
0004:  {
0005:       printf("hello world.\n");
0006:       return 0;
0007:  }

下面讨论 BASH , perl, python, awk 的几种实现方法。

- BASH 的实现

$cat b.sh
IFS=$(echo -en '\n')
line=0
while read -r i ; do
   line=$((line + 1))
   printf "%04d:  %s\n" "$line" "$i"
done
$cat cc.c | sh b.sh
0001:  #include <stdio.h>
0002:
0003:  int main (int argc, char * argv[])
0004:  {
0005:       printf("hello world.\n");
0006:       return 0;
0007:  }

注意问题: 1. read 函数是用 $IFS 来区分一个单词的,所以要读取一行,要设置 $IFS 变量。 1. read 函数的 -r 选项用来取消 escape 字符的功能。否则,斜杠字符会被特殊对待。

- perl 的实现

$perl -ane 'printf("%04d:  %s", ++$i,$_)' cc.c
0001:  #include <stdio.h>
0002:
0003:  int main (int argc, char * argv[])
0004:  {
0005:       printf("hello world.\n");
0006:       return 0;
0007:  }
这只是 perl 的一种实现方法。还有很多种方法可以实现。 - AWK 的实现
$awk  '{printf("%04d:  %s\n",++i,$0)}' cc.c
0001:  #include <stdio.h>
0002:
0003:  int main (int argc, char * argv[])
0004:  {
0005:       printf("hello world.\n");
0006:       return 0;
0007:  }

- Python 的实现

$cat b.py
import sys;
i = 0;
for line in sys.stdin.readlines():
    i=i+1
    sys.stdout.write("%04d:  %s"%(i,line))
$cat cc.c | python b.py
0001:  #include <stdio.h>
0002:
0003:  int main (int argc, char * argv[])
0004:  {
0005:       printf("hello world.\n");
0006:       return 0;
0007:  }