使用 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
.
我有以下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
.