我创建了一个简单的脚本,使用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
答案 0 :(得分:2)
乍一看,您应该将命令行中的文件名删除到grep
,以便从stdin中读取grep
:
cat -n catalog.txt | grep -v '^$'
^^^
在您的代码中,您向catalog.txt
提供了grep
,这使得它从文件中读取并忽略其标准输入。所以你基本上是grepping
来自文件,而不是cat
输出到它的标准输入。
要正确忽略前缀行号的空行,请切换grep
和cat
的顺序:
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
在这种情况下,第二行是空白的。