如何使grep忽略第一行并处理其他行

时间:2019-04-21 05:25:28

标签: linux sed grep

我需要删除一些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"

但这也会删除标题!

6 个答案:

答案 0 :(得分:3)

使用sed:

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

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

输出:

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

答案 1 :(得分:2)

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

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

忽略第一行,并删除以#开头的所有其他行。

答案 2 :(得分:1)

尝试将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并将这些留置权附加到同一输出文件中。

答案 3 :(得分:1)

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

#

答案 4 :(得分:0)

在gnu sed上尝试

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

答案 5 :(得分:0)

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

作为 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 工具。