【问题标题】:Merge every other column合并每隔一列
【发布时间】:2020-10-28 21:58:13
【问题描述】:

尝试合并从$3 开始的所有其他制表符分隔列

NC_044998.1     3757    ref     ref     ref     ref     ref     ref     ref     ref     ref     dev

所以输出是

NC_044998.1     3757    refref     refref     refref     refref     refdev

使用

awk 'BEGIN {FS = "\t"} {for (i=3; i<=12; i+=2) {gsub(/\t/, "", $i)1;} print $0};' input

但输出与输入相同

【问题讨论】:

  • 如果您使用\t 作为列分隔符,列不能再包含分隔符本身。

标签: awk gsub


【解决方案1】:

使用gnu awk,您可以使用正则表达式来做到这一点:

awk -F '\t' -v beg=2 '{
   s=""
   for (i=1; i<=beg; ++i)
      s = s $i FS;
   print s gensub( /\t+(\S+\t*)/, "\\1", "g", substr($0, length(s)+1) )
}' file
NC_044998.1  3757   refref  refref  refref  refref  refdev

PS:您可以在此 awk 命令中将任何其他列位置作为 beg 参数

【讨论】:

    【解决方案2】:

    使用 GNU awk:

    awk 'BEGIN {FS=OFS="\t"} { for (i=0; i<5; i++){$(i+3)=$(i*2+3) $(i*2+4)} NF=7; print }' input
    

    输出:

    NC_044998.1 3757 refref refref refref refref refdev

    这里发生了什么?

    • 第 3 列获取第 3 列和第 4 列的内容。
    • 第 4 列获取第 5 列和第 6 列的内容。
    • 第 5 列获取第 7 列和第 8 列的内容。
    • 第 6 列获取第 9 列和第 10 列的内容。
    • 第 7 列获取第 11 列和第 12 列的内容。
    • 列的输出仅限于前 7 列 (NF=7)。

    见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

    【讨论】:

    • 谢谢!实际上,我的文件有 53 列,我想从第 32 列开始合并。所以它会变成 awk 'BEGIN {FS = "\t"} { for (i=0; i
    • 我假设:awk -v start=32 -v end=53 '{FS=OFS="\t"} { for (i=0; i&lt;end-start; i++){$(i+start)=$(i*2+start) $(i*2+start+1) } NF=(end-start-1)/2+start; print }' input
    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2020-08-18
    • 2020-08-30
    • 1970-01-01
    相关资源
    最近更新 更多