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

Subtract multiple comma-separated values in two tab-separated columns using awk

我有以下table

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。所需的结果应打印在第五个制表符分隔的列中。输出 table 应该类似于

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 代码行:

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

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

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

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

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

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

我尝试将第一行代码与第三行代码结合起来:

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

这就是我卡住的地方。我很乐意提出任何想法。

不需要任何临时文件。这可以使用一次 awk 调用来完成:

BEGIN {
    FS = OFS = "\t"
}

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

用逗号分隔第三列和第四列。打印该行,然后是制表符,然后是每次减法的结果。

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

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