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



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

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

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}: 使用此处awkprint功能打印FNR(行号,其中将包含行号,它是awk的开箱变量),然后打印$0表示当前行。

通过这种方式,我们满足了OP保留空行的条件,并打印行号以及行。我希望这对你有所帮助。

最新更新