我需要删除一些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"
但这也会删除标题!
答案 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)
尝试将head
和grep
组合使用,如下所示:
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 工具。