首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用awk在两个制表符分隔列中减去多个逗号分隔的值。

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

Stack Overflow用户
提问于 2016-10-15 14:04:29
回答 1查看 250关注 0票数 0

我有下表

代码语言:javascript
复制
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。所需结果应打印在第五个选项卡分隔的列中。输出表应该如下所示

代码语言:javascript
复制
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代码行:

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

代码语言:javascript
复制
awk '{for(i=1;i<=NF;i++)x-=$i;print x}' fileA

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

代码语言:javascript
复制
awk -F'\t' '{print $3}' fileA > fileB
awk -F'\t' '{print $4}' fileA > fileC

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

代码语言:javascript
复制
awk 'NR==FNR{a[NR]=$1;next}{print $1+a[FNR],$2}' file1 file2

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

代码语言:javascript
复制
awk 'NR==FNR{a[NR]=$1;next}{print $1+a[FNR],{for(k=1;k<=NF;k++)z-=$i;print z}$2}' fileB fileC

那就是我被困在那里的地方。任何想法我都会高兴的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-15 14:21:32

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

代码语言:javascript
复制
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一样运行脚本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40059975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档