【问题标题】:Extract specific columns from file with shell script使用 shell 脚本从文件中提取特定列
【发布时间】:2020-06-18 02:31:18
【问题描述】:

我有一个巨大的文本文件,我想从中提取特定的列。我可以在 python 中做到这一点,但由于文件有大约 12 亿行,这会很慢。该文件如下所示(显示一行):

chr1    9734    10486   ID=SRX502813;Name=Input%20control%20(@%20IMR-90);Title=GSM1358818:%20HIRA%20OIS%20Control%20input%20DNA%3B%20Homo%20sapiens%3B%20ChIP-Seq;Cell%20group=Lung;<br>source_name=Fibroblasts;cell%20line=IMR90;chip%20antibody=none; 1000    .   9734    10486   255,0,0

现在,我想提取前三列和 ID,它是第四列的一部分:

chr1    9734    10486   SRX502813

我可以使用以下代码提取前三列,但我无法在第 4 列中拆分子字符串:

#!/usr/bin/bash
# -*- coding: None -*-
end_of_file=0
while [[ $end_of_file == 0 ]]; do
  read -r line
  end_of_file=$?
  grep SRX* | cut -f 1-3 >> out_file.txt
done < "$1"

可能有人可以提供有关如何解决此问题的提示?非常感谢!

【问题讨论】:

    标签: python bash shell unix


    【解决方案1】:

    假设第 4 列始终以 ID= 开头,后跟 ID,然后是 ; 并假设前 3 列不包含 ID=,您可以像这样使用 sed

    sed 's/ID=\([^;]*\);.*/\1/' inputfile
    

    这会在ID= 之后捕获除; 之外的一系列字符。如果 ID 并不总是以 ; 结尾,您可以使用另一种模式来搜索字母数字字符序列

    sed 's/ID=\([[:alnum:]]*\).*/\1/' inputfile
    

    当我创建一个文件 inputfile 包含问题中的行时,我得到了结果

    chr1    9734    10486   SRX502813
    

    如果您只想提取包含 ID=SRX 的行,您可以将其与 fgrep 结合使用

    fgrep 'ID=SRX' inputfile | sed 's/ID=\([^;]*\);.*/\1/'
    

    【讨论】:

    • 感谢您的回答。这给我留下了以下行:chr1 9734 10486 ID=SRX502813 Name=Input%20control%20(@%20IMR-90) Title=GSM1358818:%20HIRA%20OIS%20Control%20input%20DNA%3B%20Homo%20sapiens%3B%20ChIP-Seq Cell%20group=Lung &lt;br&gt;source_name=Fibroblasts cell%20line=IMR90 chip%20antibody=none 如何摆脱以name 开头的最后一个文本块?
    • awk -F'Name' '{print $1}' inputfile
    • @tirichl 您的输入与问题中的完全相同吗?如果没有,请编辑您的问题并显示有问题的输入行。您评论中的行在 ID 后面没有 ;。请在您的问题中指定 ID 字段的确切格式(或可能的格式)。
    【解决方案2】:

    使用 awk。

    awk -F';' '{sub(/ID=/,"");print $1}' inputfile
    

    【讨论】:

      猜你喜欢
      • 2019-10-15
      • 2022-11-14
      • 2020-09-06
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 2018-06-14
      • 2016-06-04
      相关资源
      最近更新 更多