
tsv文件用Excel打开是这样的格式(假设用n列),我想要利用awk工具找到每一个A列在剩下列中特有的部分,思路是在加入额外一列,在原有的去除A列的所有列,每有一个列有内容就在额外加入的一列中记1(如果全都有那就是n-1),然后特异性的也就是在去除A列的所有列中只有一列有内容(在额外列中记1)所在的横行,我最后要得到类似这样格式的文件。
对应行名1 对应列名1 特异性基因1
对应行名2 对应列名2 特异性基因2
......... ........ ..........
对应行名n 对应列名n 特异性基因n用Excel打开文件后,在除了第一列之外的所有列全部不选择空白,得到的就是共性数据,最后我仅需要输出这些满足条件的行名。此时只需要在特异性的基础上更改代码,输出所有在额外列中为n-1的数据格所对应的行名。并且在输出结果中简化,只输出对应行名。
对应行名1
对应行名2
...
对应行名3# 使用制表符作为字段分隔符
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输出示例:
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# 使用制表符作为字段分隔符
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输出示例:
OG0000001
OG0000002
OG0000011
OG0000013
OG0000014
OG0000018
OG0000020
OG0000021
OG0000022
OG0000023
OG0000025
OG0000027
OG0000028
OG0000029
OG0000030
......
OG0003427
OG0003462#错误行目前我的代码在处理最末端的空格时会出现识别不到的现象,误以为每一列都有非空白数据,这可能会对共性的处理产生较大问题(比如示例数据),希望师兄和老师批评指正!

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

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

那么,师兄我该如何改进代码使得最后一列识别不出错呢?求您解惑
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。