shell - 如何在保留标题的同时使用 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
解决方案
替换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 -
推荐阅读
- html - 如何在 dart 中使用 beautifulsoup scrape 从网页中获取特定元素
- java - 如何表示 Optional 类型的属性
在 OpenAPI 3 上 - sql - H2 嵌入式 DB LIMIT + OFFSET> Integer.MAX_VALUE 导致错误结果
- python - 如何以不同的时间安排间隔运行 subdags?
- elasticsearch - Ubuntu 18.04.2 LTS 上的 Elasticsearch:没有发布文件
- dependencies - 是否可以选择自动删除点图中的“冗余”边缘?
- scala - 分别处理spark中的多个目录
- spring-boot - 如何使用 Spring Boot JacksonTester 测试属性是否不存在?
- regex - 如何用数字和捕获组替换字符串?
- robotframework - 如何使用ssh在robotfamework中同时运行不同的机器人文件案例