Pau*_*aul 0 shell statistics awk r python-3.x
我有这样的矩阵(第一列名称其余是值,分隔符 i 选项卡):
name1 A1 B1 C1 D1
name2 A2 B2 C2 D2
Run Code Online (Sandbox Code Playgroud)
矩阵可能很大(这意味着大约数百行和列)。它是相同大小的。我可以期待零值。
我需要这样的输出:
name1 A1 B1 C1 D1 A1/B1 A1/C1 A1/D1
name2 A2 B2 C2 D2 A2/B2 A2/C2 A2/D2
Run Code Online (Sandbox Code Playgroud)
这个组合保存到新文件。然后再做一个组合:
name1 A1 B1 C1 D1 B1/A1 B1/C1 B1/D1
name2 A2 B2 C2 D2 B2/A2 B2/C2 B2/D2
Run Code Online (Sandbox Code Playgroud)
依此类推 => 将每一列与矩阵中的其余列分开并另存为 TSV 到新文件。并且也四舍五入到小数点后三位。
我可以使用脚本手动执行此操作:
awk '{OFS="\t"}{$6=$2/($3+0.001); $7=$2/($4+0.001); $8=$2/($5+0.001)}1' input_file.tsv
Run Code Online (Sandbox Code Playgroud)
我添加数字 0.001 的原因是不可能除以零。我可以用 wile 循环创建 shell 脚本,但需要很长时间。
我会很高兴这个过程的任何自动化。
你能不能试试以下。此外,通过看到您的尝试,我假设您的 Input_file 由空格而不是逗号分隔,如果还有除空格以外的任何其他分隔符,则BEGIN{FS=","}在以下代码中添加(以逗号为例)。感谢@accdias 添加了删除控制 M 字符的逻辑
awk '
{
gsub(/\r/,"")
}
{
nf=NF
close(out_file)
for(k=2;k<=nf;k++){
out_file=""
for(i=2;i<=nf;i++){
if($i!=0){
$(NF+1)=sprintf("%.03f",$k/$i)
}
else{
$(NF+1)=sprintf("%s","NaN")
}
}
out_file=k"field_out_file"
print >> (out_file)
NF=nf
}
}' Input_file
Run Code Online (Sandbox Code Playgroud)
代码负责什么:
2field_out_file意味着第二个字段被 Input_file/ 中的所有元素划分。close函数来避免诸如too many files opened.0值是否被零除以它NaN在输出中打印。