首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Project1-特异性/共性数据处理

Project1-特异性/共性数据处理

原创
作者头像
于是没有洗头
修改2024-12-03 13:32:56
修改2024-12-03 13:32:56
3720
举报
文章被收录于专栏:ProjectProject

1、处理思路

现有tsv数据样式
现有tsv数据样式

1、特异性数据

tsv文件用Excel打开是这样的格式(假设用n列),我想要利用awk工具找到每一个A列在剩下列中特有的部分,思路是在加入额外一列,在原有的去除A列的所有列,每有一个列有内容就在额外加入的一列中记1(如果全都有那就是n-1),然后特异性的也就是在去除A列的所有列中只有一列有内容(在额外列中记1)所在的横行,我最后要得到类似这样格式的文件。

代码语言:txt
复制
对应行名1   对应列名1    特异性基因1
对应行名2   对应列名2    特异性基因2
.........   ........    ..........
对应行名n   对应列名n    特异性基因n

2、共性数据

用Excel打开文件后,在除了第一列之外的所有列全部不选择空白,得到的就是共性数据,最后我仅需要输出这些满足条件的行名。此时只需要在特异性的基础上更改代码,输出所有在额外列中为n-1的数据格所对应的行名。并且在输出结果中简化,只输出对应行名。

代码语言:txt
复制
对应行名1
对应行名2
...
对应行名3

2、awk工具代码实现

1、特异性数据

代码语言:shell
复制
# 使用制表符作为字段分隔符
awk -F'\t' '
BEGIN {
    # 初始化一个数组来保存列名
    split("", col_names);  # 初始化空数组
}

# 处理文件的第一行,保存列名
NR == 1 {
    for (i = 2; i <= NF; i++) {
        col_names[i] = $i;
    }
    next;  # 跳过第一行,不进行后续处理
}

{
    # 初始化计数器 count 为 0
    count = 0;
    unique_col = "";
    unique_value = "";

    # 遍历从第二列(B列)到最后一列
    for (i = 2; i <= NF; i++) {
        # 检查当前列是否有内容
        if ($i != "") {
            # 如果有内容,计数器加 1
            count++;
            # 保存当前列的值
            unique_value = $i;
            # 保存对应的列名
            unique_col = col_names[i];
        }
    }

    # 如果计数器等于 1,说明只有 B 到最后一列中的一个列有内容
    if (count == 1) {
        # 输出行名、列名和格内内容,格内内容放在行尾
        printf "%s\t%s\t%s\n", $1, unique_col, unique_value;
    }
}
' Orthogroups.tsv > unique_values_with_format.txt

输出示例:

代码语言:txt
复制
OG0003412	SF16_whole_genome_CDS
	gene0331, gene1815, gene2239, gene2525, gene3979
OG0003413	SF16_whole_genome_CDS
	gene0332, gene1814, gene2238, gene2524, gene3978
OG0003987	SF16_whole_genome_CDS
	gene1276, gene1277
OG0003988	SF16_whole_genome_CDS
	gene3086, gene3087

2、共性数据

代码语言:shell
复制
# 使用制表符作为字段分隔符
awk -F'\t' '
BEGIN {
    # 初始化一个数组来保存列名
    split("", col_names);  # 初始化空数组
}

# 处理文件的第一行,保存列名
NR == 1 {
    for (i = 2; i <= NF; i++) {
        col_names[i] = $i;
    }
    next;  # 跳过第一行,不进行后续处理
}

{
    # 初始化计数器 count 为 0
    count = 0;

    # 遍历从第二列(B列)到最后一列
    for (i = 2; i <= NF; i++) {
        # 检查当前列是否有内容
        if ($i != "") {
            # 如果有内容,计数器加 1
            count++;
        }
    }

    # 如果计数器大于等于标题数减1,说明有多于一个列有内容
    if (count >= NF - 1) {
        # 输出行名
        print $1;
    }
}
' Orthogroups.tsv > difference_values_row_names.txt

输出示例:

代码语言:txt
复制
OG0000001
OG0000002
OG0000011
OG0000013
OG0000014
OG0000018
OG0000020
OG0000021
OG0000022
OG0000023
OG0000025
OG0000027
OG0000028
OG0000029
OG0000030
......
OG0003427
OG0003462#错误行

3、疑问(问题已修改)

目前我的代码在处理最末端的空格时会出现识别不到的现象,误以为每一列都有非空白数据,这可能会对共性的处理产生较大问题(比如示例数据),希望师兄和老师批评指正!

用excel和代码的筛选结果的对比
用excel和代码的筛选结果的对比

excel筛选出来是3402项目,代码筛选出来是3449项目,我们抽出OG0003541(代码筛选的错误的)与OG0003410(excel筛选的正确的)对比。

OG0003541与OG0003410对比
OG0003541与OG0003410对比

所以我会发现最后一列出现空格出现了识别不到的情况,但是当我把OG0003541 E列的内容去除掉后,又发现识别正常。(所以只有最后一格是空白是识别不到,与连续无关,我应该修改问题)

OG0003541 E列的内容去除掉后的结果
OG0003541 E列的内容去除掉后的结果

那么,师兄我该如何改进代码使得最后一列识别不出错呢?求您解惑

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、处理思路
    • 1、特异性数据
    • 2、共性数据
  • 2、awk工具代码实现
    • 1、特异性数据
    • 2、共性数据
  • 3、疑问(问题已修改)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档