如何将特定列与其余列分开

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 脚本,但需要很长时间。

我会很高兴这个过程的任何自动化。

Rav*_*h13 5

你能不能试试以下。此外,通过看到您的尝试,我假设您的 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在输出中打印。