awk - 仅从输入中提取匹配的值
问题描述
我有一个像这样的标签限制文件
chr20 102 K245 A T 56.0 AC.02 AC=0.1;DC=45;AC_old=452;DP=21;sample=kj;sample_name=DKl;New_sample=rdf
chr10 8742 JH245 G T 86.0 AC.742 AC=2.1;DC=75;AC_old=42;DP=1;sample=KHS;sample_name=WEKl;New_sample=ASEf
chrX 2302 XS245 G A 786.0 AC.452 AC=8;DC=5;AC_old=4A2;DP=5;sample=SED;sample_name=MHNSKl;New_sample=rdf
并且只需要像这样提取 AC,DC,sample
chr20 102 K245 A T 56.0 AC.02 AC=0.1 DC=45 sample=kj
chr10 8742 JH245 G T 86.0 AC.742 AC=2.1 DC=75 sample=KHS
chrX 2302 XS245 G A 786.0 AC.452 AC=8 DC=5 sample=SED
我试过像这样使用 grep ,但没有达到目的
grep -wF "AC|DC|sample" < file.txt
解决方案
你可以使用这个awk
:
awk -F '[\t;]+' -v OFS='\t' '{s=""; for (i=1; i<=6; ++i) s = (i == 1 ? "" : s OFS) $i; for (i=6; i<=NF; ++i) if ($i ~ /^([AD]C|sample)[=.]/) s = s OFS $i; print s}' file
chr20 102 K245 A T 56.0 AC.02 AC=0.1 DC=45 sample=kj
chr10 8742 JH245 G T 86.0 AC.742 AC=2.1 DC=75 sample=KHS
chrX 2302 XS245 G A 786.0 AC.452 AC=8 DC=5 sample=SED
更易读的版本:
awk -F '[\t;]+' -v OFS='\t' '
{
s = ""
for (i=1; i<=6; ++i)
s = (i == 1 ? "" : s OFS) $i
for (i=6; i<=NF; ++i)
if ($i ~ /^([AD]C|sample)[=.]/)
s = s OFS $i
print s
}' file
推荐阅读
- python - 通过 PySpark 连接到 Redshift,我们如何让驱动程序工作?
- python - 使用 Xpath 提取特定数据的 Python 脚本
- azure - 重新安装的 azure point to site VPN 无法安装且没有错误消息
- android - 如何在fastlane文件中写评论
- c - 为什么这仍在计算字符串中的空格?
- java - Java 生成不重复的“Vector3”
- ios - 检测任何耳机播放/暂停前进/后退音量增大/减小按钮轻按 swift
- html - 如何使 flex column Pilot 成为第二个 flex column 高度
- java - Java Parallel Stream AnyMatch 的 Parallel Stream 的一个字段
- branch.io - 如何从 Branch Analytics 中获取 UserId - Branch.IO