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

Using cat and grep to print line and its number but ignore at the same time blank lines

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

乍一看,应该把命令行中的文件名丢到grep,让grep从stdin读取:

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

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

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

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

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

解法一:

awk 'NF{print FNR,[=10=]}' Input_file

解决方案二: 上面会打印行号,包括NULL行的行号,以防你想留空行那么下面的号码可能会对你有所帮助。

awk '!NF{FNR--;next} NF{print FNR,[=11=]}'  Input_file

解决方案 3: 仅使用 grep,尽管输出将在行号和行之间有一个冒号。

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

第一个解的解释: NF:这里检查条件如果NF(当前行的字段数,它是awk开箱即用的变量,其值为一行中的字段数)是NOT NULL,如果此条件为真,则执行旁边提到的操作。 {print FNR,[=18=]}:这里使用awkprint函数打印FNR(行号,里面会有行号,就是awk的out框变量)然后打印 [=23=] 这意味着当前行。

这样我们就满足了 OP 保留空行的条件,并且也打印了行号和行。希望对你有帮助。

您的解决方案无效,因为 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  ?

另一个awk

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

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