首页 > 解决方案 > 如何在保留标题的同时使用 grep 过滤 gz 文件

问题描述

我有一个 gz 文件,其中有几列带有标题。第一列看起来像这样:

some header0   some header1
10:100000625   a
10:100000645   b
10:100002464   c
10:100003242   d
10:100003785   e
10:100004360   f

还有另一个 txt 文件,其中包含一些第一个文件的第一列条目(无标题),例如:

 10:100002464
 10:100004360

我想创建一个新的 gz 文件,其中只包含在 txt 文件中找到的条目并保留标题。

some header0   some header1
10:100002464   c
10:100004360   f

我尝试的命令输出一个没有标题的 gz 文件。我怎样才能保留它们?

zcat my_file.gz | grep -Fw -f my_other_file.txt | gzip > my_file_new.gz

标签: shellunixgrep

解决方案


替换grep -Fw -f my_other_file.txt为:

awk 'NR==FNR{a[$1]; next} (FNR==1) || ($1 in a)' my_other_file.txt -

例如使用cat my_file.txt平面文件代替zcat my_file.gz压缩文件:

$ cat my_file.txt | awk 'NR==FNR{a[$1]; next} (FNR==1) || ($1 in a)' my_other_file.txt -
some header0   some header1
10:100002464   c
10:100004360   f

如果my_other_file.txt可以包含 DOS 行结尾(请参阅为什么我的工具输出会覆盖自身以及如何修复它?)然后使用:

awk 'NR==FNR{sub(/\r/,""); a[$1]; next} (FNR==1) || ($1 in a)' my_other_file.txt -

推荐阅读