linux - 根据条件替换值并使用 AWK 比较来自多个文件的值
问题描述
我花了一天的时间试图解决这个问题,但没有成功。我有两个这样的文件:
文件1:
chr id pos
14 ABC-00 123
13 AFC-00 345
5 AFG-99 988
文件2:
index id chr
1 ABC-00 14
2 AFC-00 11
3 AFG-99 7
我想检查文件 1 中 chr 的值是否 != 来自文件 2 中的 chr 是否具有相同的 ID,如果这是真的,我想从两个文件中打印一些列以得到如下所示的输出。
预期的输出文件:
ID OLD_chr(File1) NEW_chr(File2)
AFC-00 13 11
AFG-99 5 7
.....
Total number of position changes: 2
我有一个警告。在文件 1 中,我必须在比较文件之前替换 $1 列中的一些值。像这样:
30 and 32 >> X
31 >> Y
33 >> MT
因为在文件 2 中,这就是这些值的编码方式。然后比较两个文件。我到底怎么能做到这一点?
我试图重新编码文件 1:
awk '{
if($1=30 || $1=32) gsub(/30|32/,"X",$1);
if($1=31) gsub(/31/,"Y",$1);
if($1=33) gsub(/33/,"MT",$1);
print $0
}' File 1 > File 1 Recoded
我试图匹配列并打印输出:
awk 'NR==FNR{a[$1]=$1;next} (a[$1] !=$3){print $2, a[$1], $3 }' File 1 File 2 > output file
解决方案
像这样:
awk '
BEGIN{ # executed at the BEGINning
print "ID OLD_chr("ARGV[1]") NEW_chr("ARGV[2]")"
}
FNR==NR{ # this code block for File1
if ($1 == 30 || $1 == 32) $1 = "X"
if ($1 == 31) $1 = "Y"
if ($1 == 33) $1 = "MT"
a[$2]=$1
next
}
{ # this for File2
if (a[$2] != $3) {
print $2, a[$2], $3
count++
}
}
END{ # executed at the END
print "Total number of position changes: " count+0
}
' File1 File2
ID OLD_chr(File1) NEW_chr(File2)
AFC-00 13 11
AFG-99 5 7
Total number of position changes: 2
推荐阅读
- python - 决策树的简单递归[Python]
- asp.net-mvc - 在 mvc 中编辑后无法保留原始值
- c# - 在 hangfire jobfilter 生命周期中处理 Simple Injector 异步范围
- ruby-on-rails - ubuntu 服务器(nginx+passenger+capistrano)上的 Rails 应用程序日志在哪里?
- r - R中的Beta回归模型
- python - Django不呈现表单字段
- soap - 使用失眠症来打肥皂电话
- python - {Python} 如何将字典转换为坐标?
- python - 将绘图树状图应用于文本数据
- r - 确保使用 {mongolite} 读取 MongoDB 数据时数据帧变为 tibbles