【问题标题】:how to make grep ignore first line and process other line如何让 grep 忽略第一行并处理其他行
【发布时间】:2019-09-10 19:17:05
【问题描述】:

我需要删除一些 txt 文件中以“#”开头的行。但忽略第一行作为它的标题。如何让 grep 忽略第一行并删除以 # 开头的任何行?

cat sample.txt
#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,asd
1,2,ert
#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,xyz

cat sample.txt | grep -v "^\s*[#\;]\|^\s*$" > "out.txt"

但这也会删除标题!

【问题讨论】:

标签: linux sed grep


【解决方案1】:

将任意命令应用于文件或表格数据流的第一行(“标题”)之外的所有内容对我来说是一项常见的任务,因此我为其定义了一个名为 body 的辅助实用程序:

作为一个 shell 函数(把它放在你的 ~/.bashrc 或等效项中):

body() {
  IFS= read -r header
  printf '%s\n' "$header"
  "$@"
}

现在:

$ cat sample.txt | body grep -v '^#'
#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,asd
1,2,ert
1,2,xyz
1,2,abc
1,2,xyz

来源:改编自:Command line tools for doing data science,它是您可以放入 shell 的 PATH 变量中的众多便捷数据工具之一。希望其中许多可以规范化为标准 UNIX 工具。

【讨论】:

    【解决方案2】:

    在 gnu sed 上试过

    sed '0,/^#/n;/^#/d' sample.txt
    

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed '1b;/^#/d' file
      

      忽略第一行并删除以# 开头的任何其他行。

      【讨论】:

        【解决方案4】:

        如果行号为 1 或不以 # 开头,这将导致任何 awk 打印每一行:

        $ awk 'NR==1 || !/^#/' file
        #"EVENT",VERSION, NAME
        1,2,xyz
        1,2,abc
        1,2,asd
        1,2,ert
        1,2,xyz
        1,2,abc
        1,2,xyz
        

        【讨论】:

          【解决方案5】:

          使用 sed:

          sed '2,${/^#/d}' sample.txt
          

          从第二行 (2) 到最后一行 ($):搜索 (/.../) 以 # 开头的行 (^) 并删除 (d)。 sed 的默认动作是打印当前行。

          输出:

          #"事件",版本,名称 1,2,xyz 1,2,abc 1,2,asd 1,2,ert 1,2,xyz 1,2,abc 1,2,xyz

          【讨论】:

            【解决方案6】:

            尝试headgrep 的组合,如下所示:

            head -1 sample.txt > out.txt && grep -v "^#" sample.txt >> out.txt
            

            结果

            #"EVENT",VERSION, NAME
            1,2,xyz
            1,2,abc
            1,2,asd
            1,2,ert
            1,2,xyz
            1,2,abc
            1,2,xyz
            

            替代方法

            grep "^#" sample.txt | head -1 > out.txt && grep -v "^#" sample.txt >> out.txt
            

            即 - 以 # 开头的 grep 行,但只需选择第一个并将其写入文件。然后,grep 所有不以 # 开头的行,并将这些留置权附加到同一个输出文件中。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-06
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多