使用awk在两个以制表符分隔的列中减去多个逗号分隔值

时间:2016-10-15 14:04:30

标签: awk sum row multiple-columns

我有下表

textA   textB   1,21,41 10,30,50
textC   textB   2,22,42,62  10,30,50,70

第三列的值应从第四列中的值逐个减去,即10-1,30-21,50-41;然后是10-2,30-22,50-42,70-62。应在第五个以制表符分隔的列中打印所需的结果。输出表应该看起来像

textA   textB   1,21,41 10,30,50    9,9,9
textC   textB   2,22,42,62  10,30,50,70 8,8,8,8

我试图结合一些awk代码行:

(伪)代码行理论上可以在一列中减去多个值,与列中的值有多少

awk '{for(i=1;i<=NF;i++)x-=$i;print x}' fileA

我现在基于我的第三和第四列生成两个独立的文件

awk -F'\t' '{print $3}' fileA > fileB
awk -F'\t' '{print $4}' fileA > fileC

(伪)代码第三行理论上可以处理来自不同文件的值

awk 'NR==FNR{a[NR]=$1;next}{print $1+a[FNR],$2}' file1 file2

我尝试将代码行1与代码行3结合起来:

awk 'NR==FNR{a[NR]=$1;next}{print $1+a[FNR],{for(k=1;k<=NF;k++)z-=$i;print z}$2}' fileB fileC

这就是我被卡住的地方。我很乐意接受任何想法。

1 个答案:

答案 0 :(得分:1)

无需任何临时文件。这可以通过一次调用awk来完成:

BEGIN {
    FS = OFS = "\t"
}

{
    n = split($3 "," $4, a, /,/) / 2
    printf "%s%s", $0, OFS
    for (i = 1; i <= n; ++i)
        printf "%d%s", a[i+n]-a[i], (i<n?",":ORS)
}

在逗号上拆分第三和第四列。打印该行,然后是制表符,然后是每个减法的结果。

假设第三和第四列中的数字相等。

运行类似awk -f script.awk file的脚本。