【问题标题】:Using cat and grep to print line and its number but ignore at the same time blank lines使用 cat 和 grep 打印行及其编号,但同时忽略空白行
【发布时间】:2018-07-07 09:02:16
【问题描述】:

我创建了一个使用 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

【问题讨论】:

    标签: linux bash shell grep cat


    【解决方案1】:

    您的解决方案不起作用,因为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  ?
    

    【讨论】:

    • 谢谢,这行得通。顺便说一句,为什么它不能反过来工作(首先使用 cat 和 grep 第二)?
    • @JohnM。因为cat -n 已经为您提供了没有空行的输出,所以grep 将找不到匹配项。尝试仅输出 cat -n catalog.txt 并查看输出内容,然后检查您的正则表达式在 grep 中匹配的内容。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      另一个awk

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

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

      【讨论】:

        【解决方案4】:

        单一、简单、基本的awk 解决方案可以在这里为您提供帮助。

        解决方案一:

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

        解决方案 2: 上面将打印行号,包括 NULL 行的行号,如果您想留下空行行号,那么以下可能对您有所帮助.

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

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

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

        解决方案一的解释: NF:如果NF(当前行中的字段数,它是awk 的开箱变量,其值为一行中的字段数)不为NULL,则在此检查条件为 TRUE,然后执行旁边提到的操作。 {print FNR,$0}:在这里使用awkprint函数打印FNR(行号,其中将包含行号,它是awk的开箱变量)然后打印$0表示当前行。

        这样我们就满足了 OP 留下空行和打印行号的条件。希望对您有所帮助。

        【讨论】:

        • 可以确认,这也很好用,虽然有点复杂。无论如何,知道如何使用awk是非常有用的。
        • @JohnM.,相信我一点也不复杂:)。我也添加了我的解释,如果您也有任何困惑,请告诉我。
        • 欣赏解释。我明白为什么这并不复杂,但我忘了提到我是 linux 新手,所以大多数事情都不是很简单。与windows相比,这是一个新世界。
        • @JohnM.. 还添加了 1 个解决方案,它将保留 NULL 行的行号,它不会在输出的行号中考虑它们。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 2011-04-03
        • 1970-01-01
        • 2014-08-10
        • 2022-12-11
        相关资源
        最近更新 更多