读取行并输出行以及行号的 Shell 程序

读取行并输出行以及行号的 Shell 程序

我需要编写一个程序,从文件中读取行并使用行号stdin写入行。stdout我无法使用cat -n.

假设文本文件有这样的内容:

 abcdef
 ghi

 klm
 nopqr st

它基本上应该读取这些行并输出这些行,但带有行号。

这是我的 while read 循环,但它不会打印出每一行。

while read line
do
    awk '{print NR, $0}'

done < file

基本上这个输出是这样的:

1 ghi
2 
3 klm
4 nopqr   st

由于某种原因,abcdef没有显示,并且数字 2 不应该为空。

答案1

你有没有尝试过nl -b a <file_name>

debian@virt00:~/test$ nl -b a file
     1  abcdef
     2   ghi
     3
     4   klm
     5   nopqr st
debian@virt00:~/test$
  • nl 代表数轴
  • -b 正文编号标志
  • 'a' 代表所有行。

了解更多信息http://linux.die.net/man/1/nl

答案2

您可以使用“cat -n”,标志“-n”是将数字添加到“cat”的输出行。

答案3

awk '$0!=""{print NR, $0}' file

指清空$0 != ""$0 not equal对于这些行,打印行号和行数。


这将产生以下输出:

1 abcdef
2 ghi
4 klm
5 nopqr st

与旧的行号。如果您需要带有新行号的输出:

awk '$0!=""{a++; print a, $0}' file

1 abcdef
2 ghi
3 klm
4 nopqr st

解释一下你的脚本是如何工作的:

的行将read line读取第一行(您不打印它)。
然后,您将文件连接到awk并处理所有其他行。
awk 不会(默认情况下)消除空行,因此空行也会被打印。

解决这个问题的方法有很多,上面的方法看起来最简单。

答案4

#!/bin/bash

awk '!/^$/{print ++a, $0}' file

echo

awk '!!$0{print ++a, $0}' file

echo

awk '{if ($0 != "") print ++aa, $0}' file

echo

NR=0
while read -r
do
    [[ "${REPLY}" = "" ]] || echo $((++NR)) "${REPLY}"
done < file

echo

相关内容