如何从特定列的模式中删除文本

时间:2019-02-01 16:29:37

标签: bash tabular

我有一个表文件,例如:

qseqid  sseqid  pident  length  mismatch    gapopen qstart  qend    sstart  send    evalue  bitscore    strand

scaffold    EOG091B09QV:/path/path/Z    xx  a   1:8830-20153    74.3    144 0   1
scaffold    EOG091B09QV:/path/path/A    x   a   1:8830-20153    100.0   93  0   0
scaffold    EOG091B09QV:/path/path/Q    x   a   1:8830-20153    41.3    189 49  3
scaffold    EOG091B09QV:/path/path/U    x   a   1:8830-20153    87.5    48  6   0
scaffold    EOG091B09QV:/path/path/K    x   a   1:8830-20153    100.0   60  0   0

这个想法只是删除:之后的sseqid列中的文本 并获得:

qseqid  sseqid  pident  length  mismatch    gapopen qstart  qend    sstart  send    evalue  bitscore    strand

scaffold    EOG091B09QV xx  a   1:8830-20153    74.3    144 0   1
scaffold    EOG091B09QV x   a   1:8830-20153    100.0   93  0   0
scaffold    EOG091B09QV x   a   1:8830-20153    41.3    189 49  3
scaffold    EOG091B09QV x   a   1:8830-20153    87.5    48  6   0
scaffold    EOG091B09QV x   a   1:8830-20153    100.0   60  0   0

我知道cut -f 1 -d ":"匹配_species_strand_H.m8可以工作,但不适用于特定列。

3 个答案:

答案 0 :(得分:2)

awk是处理基于列的文本的不错选择:

int main() {
    [[maybe_unused]] constexpr auto a = Sequence<>{} | Sequence<>{};
    [[maybe_unused]] constexpr auto b = Sequence<>{} | Sequence<3, 4, 5>{};
    [[maybe_unused]] constexpr auto c = Sequence<1>{} | Sequence<1, 2>{};
    [[maybe_unused]] constexpr auto d = Sequence<1>{} | Sequence<3, 4, 5>{}; // VC++, error C2679
}

将完成以下工作:“从第二列中删除awk 'sub(/:.*/,"",$2)+7' file

答案 1 :(得分:1)

我更喜欢Perl:

cat inputfile | perl -ne '@in=split(/\s/);$in[1]=~s/:(.*)$//;print(join(" ",@in));print "\n"'

perl -ne遍历每条输入线,将该行拆分为一个数组,替换第二个元素中的内容并将数组连接在一起。

答案 2 :(得分:1)

您可以使用sed轻松地做到这一点:

sed -r 's/^(\S+\s+[^:[:space:]]+):\S+/\1/g' filename

括号内的部分与第一列,第一列和第二列之间的空格以及第二列的部分匹配,直到(但不包括):字符为止。 :\S+与第二列的其余部分匹配。然后,仅用\1表示的括号内的部分替换该行的整个匹配部分。