我有一个表文件,例如:
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
可以工作,但不适用于特定列。
答案 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
表示的括号内的部分替换该行的整个匹配部分。