【问题标题】:Use awk/bash to add 1 to all columns but first使用 awk/bash 将 1 添加到所有列,但首先
【发布时间】:2020-03-29 23:09:46
【问题描述】:

我有一个表格,其中标题是样本列表,第一列是基因列表,其余的是每个样本中每个基因的表达值。我想为所有值添加 1 的伪计数,我目前这样做:

cat <(head -n 1 TPM/QuickTest_Dataset.table) \
<(tail -n +2 TPM/QuickTest_Dataset.table | awk '{print $1, $2+1, $3+1, $4+1, $5+1, $6+1, $7+1, $8+1, $9+1, $10+1, $11+1, $12+1, $13+1, $14+1, $15+1, $16+1, $17+1, $18+1, $19+1, $20+1, $21+1}' | sed 's, ,\t,g') > StringTie-TPM_Homo_sapiens_GRCh38.Exp9-PMacrophageM1.protein_coding.table

但是,样本的数量并不总是 20(列的数量并不总是 21),有时更多有时更少,我每次都必须手动调整。

有没有更简单的方法?

【问题讨论】:

  • 请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。

标签: awk


【解决方案1】:

awk 是很棒的语言。只需遍历字段并递增它们。

awk '{ for (i = 2; i <= NR; ++i) $i += 1; } 1'

【讨论】:

    【解决方案2】:

    您可以通过一个awk 调用来做到这一点:

    awk 'BEGIN{OFS="\t"} FNR==1{print; next} {for (i=2;i<=NF;i++)$i=$i+1}1' infile > outfile
    

    【讨论】:

    • 也可以在单个块中完成:FNR&gt;1{for(i=2; i&lt;=NF; i++) $i++} 1'
    • $i=$i+1 = $i+=1 或只是$i++
    【解决方案3】:

    Google 搜索“awk 字段数”让我找到 this post,提到您可能使用的变量 NF

    搜索“awk for-loop”会重定向到this URL,其中演示了以下简单的awk for-loop(这也使用了NF 变量):

    awk '{ for (i = 1; i <= NF; i++) total = total+$i }; END { print total }'
    

    这可能会为您解决此问题提供一个良好的开端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 2022-07-07
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      相关资源
      最近更新 更多