使用cat和grep打印行及其编号但同时忽略空白行

时间:2018-01-28 15:49:19

标签: linux bash shell grep cat

我创建了一个简单的脚本,使用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

我设法摆脱空白行,但不打印行号。我做错了什么?

以下是catalog.txt的内容:

 George Jones Berlin 2564536877

 Mike Dixon Paris 2794321976

4 个答案:

答案 0 :(得分:2)

乍一看,您应该将命令行中的文件名删除到grep,以便从stdin中读取grep

cat -n catalog.txt | grep -v '^$'
                                  ^^^

在您的代码中,您向catalog.txt提供了grep,这使得它从文件中读取并忽略其标准输入。所以你基本上是grepping来自文件,而不是cat输出到它的标准输入。

要正确忽略前缀行号的空行,请切换grepcat的顺序:

grep -v '^$' catalog.txt | cat -n

答案 1 :(得分:2)

单一,简单,基本的awk解决方案可以帮助您。

解决方案1:

awk 'NF{print FNR,$0}' Input_file

解决方案第二: 上面会打印行号,包括NULL行的行号,如果你想留空行号,那么下面的内容可能对你有所帮助

awk '!NF{FNR--;next} NF{print FNR,$0}'  Input_file

解决方案3: 仅使用grep,但输出的行号和行之间会有冒号。

grep -v '^$' Input_file | grep -n '.*'

解决方案1的说明: NF:此处检查条件NF(当前行中的字段数,awk' s开箱即用变量,其中包含字段数的值line)是非NULL,如果此条件为TRUE,则遵循其旁边提到的操作。 {print FNR,$0}:在此print使用awk功能打印FNR(行号,其中包含行号,为awk }' s out of box变量)然后打印$0,这意味着当前行。

通过这种方式,我们既满足了OP的空白条件,又打印了行号和行。我希望这会对你有所帮助。

答案 2 :(得分:2)

您的解决方案无效,因为cat -n catalog.txt已经为您提供了非空行。

您可以将grep的输出传送到cat -n

grep -v '^$' yourFile | cat -n

示例:

<强>的test.txt

Hello

how
are


you
?
$ grep -v '^$' test | cat -n
     1  Hello
     2  how
     3  are
     4  you
     5  ?

答案 3 :(得分:2)

另一个awk

$ awk 'NF{$0=FNR  " " $0}NF' 48488182
1 George Jones Berlin 2564536877
3 Mike Dixon Paris 2794321976

在这种情况下,第二行是空白的。