我有下表
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
这就是我被卡住的地方。我很乐意接受任何想法。
答案 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
的脚本。