我需要编写一个程序,从文件中读取行并使用行号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' 代表所有行。
答案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