>我创建了一个简单的脚本,使用 cat 命令打印文本文件的内容。现在我想打印一行及其编号,但同时我需要忽略空白行。需要以下格式:
1 George Jones Berlin 2564536877
2 Mike Dixon Paris 2794321976
我试过使用
cat -n catalog.txt | grep -v '^$' catalog.txt
但我得到以下结果:
George Jones Berlin 2564536877
Mike Dixon Paris 2794321976
我已经设法摆脱了空白行,但没有打印行的编号。我做错了什么?
以下是目录.txt的内容:
George Jones Berlin 2564536877
Mike Dixon Paris 2794321976
您的解决方案不起作用,因为cat -n catalog.txt
已经为您提供了非空行。
你可以通过管道将grep
的输出传送到cat -n
:
grep -v '^$' yourFile | cat -n
例:
测试.txt:
Hello
how
are
you
?
$ grep -v '^$' test | cat -n
1 Hello
2 how
3 are
4 you
5 ?
乍一看,您应该将文件名放在命令行中以grep
,以便从 stdin 读取grep
:
cat -n catalog.txt | grep -v '^$'
^^^
在您的代码中,您向grep
提供了catalog.txt
,这使它从文件中读取并忽略其标准输入。因此,您基本上是从文件中grepping
的,而不是通过管道传输到其 stdincat
输出。
要正确忽略空行的前置行号,请切换grep
和cat
的顺序:
grep -v '^$' catalog.txt | cat -n
另一个awk
$ awk 'NF{$0=FNR " " $0}NF' 48488182
1 George Jones Berlin 2564536877
3 Mike Dixon Paris 2794321976
在本例中,第二行为空。
单一,简单,基本的awk
解决方案可以在这里为您提供帮助。
解决方案1st:
awk 'NF{print FNR,$0}' Input_file
解决方案2nd:上面将打印行号,包括NULL 行的行号,如果您想留下空行行号,那么以下内容可能会对您有所帮助。
awk '!NF{FNR--;next} NF{print FNR,$0}' Input_file
解决方案 3rd:仅使用grep
,尽管输出将在行号和行之间有一个冒号。
grep -v '^$' Input_file | grep -n '.*'
解决方案1st的解释:NF
:如果NF
(当前行中的字段数,它是awk
的开箱即用变量,具有一行中字段数的值)不是NULL,则在此处检查条件,如果此条件为TRUE,则按照旁边提到的操作进行操作。{print FNR,$0}
: 使用此处awk
print
功能打印FNR
(行号,其中将包含行号,它是awk
的开箱变量),然后打印$0
表示当前行。
通过这种方式,我们满足了OP保留空行的条件,并打印行号以及行。我希望这对你有所帮助。