使用 awk 仅包含以特定值开头的列?

HKJ*_*KJ3 2 regex awk

我有一个包含 7 列、1.92 亿行的文件。我想过滤该文件,使其仅包含以第二列chr1_和开头的数据。chr7_

head file.txt.gz
gene_id variant_id  tss_distance    ma_samples  ma_count    maf pval_nominal    slope   slope_se
ENSG00000227232.5   chr1_13550_G_A_b38  -16003  16  16  0.0132231   0.329834    0.188778    0.193552
ENSG00000227232.5   chr1_14671_G_C_b38  -14882  12  12  0.00991736  0.618791    0.110828    0.222611
ENSG00000227232.5   chr2_14677_G_A_b38  -14876  60  60  0.0495868   0.378305    -0.090737   0.102905
ENSG00000227232.5   chr3_16841_G_T_b38  -12712  46  46  0.0380165   0.100419    -0.191008   0.116067
ENSG00000227232.5   chrX_16856_A_G_b38  -12697  10  10  0.00826446  0.708684    -0.0901965  0.241282
ENSG00000227232.5   chrX_17005_A_G_b38  -12548  18  18  0.014876    0.153674    -0.257458   0.180205
ENSG00000227232.5   chr4_17005_A_G_b38  -12548  18  18  0.014876    0.153674    -0.257458   0.180205
ENSG00000227232.5   chr7_17005_A_G_b38  -12548  18  18  0.014876    0.153674    -0.257458   0.180205
Run Code Online (Sandbox Code Playgroud)

输出:

head file.txt.gz
gene_id variant_id  tss_distance    ma_samples  ma_count    maf pval_nominal    slope   slope_se
ENSG00000227232.5   chr1_13550_G_A_b38  -16003  16  16  0.0132231   0.329834    0.188778    0.193552
ENSG00000227232.5   chr1_14671_G_C_b38  -14882  12  12  0.00991736  0.618791    0.110828    0.222611
ENSG00000227232.5   chr7_17005_A_G_b38  -12548  18  18  0.014876    0.153674    -0.257458   0.180205
Run Code Online (Sandbox Code Playgroud)

第二列的数据格式为chrnumber _number_letter_letter_b38. 数字和字母可以不同。例如chr4_17005_A_G_b38ch7_17090_A_T_b38。我只想第二列以chr1_or开头chr7_。我将如何使用 来做到这一点awk

我已经累了

gunzip -c file.txt.gz | awk '$2 ~ /^chr1/' > output.txt
Run Code Online (Sandbox Code Playgroud)

但是输出还包含 chr19 和 chr10。一切都带有 1。我也不确定如何包含 chr7。

anu*_*ava 9

您可以使用:

gunzip -c file.txt.gz | awk '$2 ~ /^chr[17]_/' > output.txt
Run Code Online (Sandbox Code Playgroud)

^chr[17]_将匹配chr1_chr7_紧接在开始位置之后。通过添加,_我们可以确保我们不匹配chr10or chr75