使用 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
的输出管道到它的标准输入。
要正确忽略空行和前置行号,请切换 grep
和 cat
的顺序:
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=]}
:这里使用awk
的print
函数打印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
在这种情况下第二行是空白的。
我创建了一个简单的脚本,它使用 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
的输出管道到它的标准输入。
要正确忽略空行和前置行号,请切换 grep
和 cat
的顺序:
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=]}
:这里使用awk
的print
函数打印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
在这种情况下第二行是空白的。