首页 > 解决方案 > 增加块数据集中的特定列值并循环多次

问题描述

我正在尝试按上述顺序生成一个巨大的数据集。

4 0 1 642 643
4 642 643 1283 12
4 1283 1284 1924 1925
4 1924 1925 2565 2566
4 2565 2566 3206 3207
4 3206 3207 3847 3848
4 3847 3848 4488 4489
4 4488 4489 5129 5130

4 1 2 643 644
4 643 644 1284 1285
4 1284 1285 1925 1926
4 1925 1926 2566 2567
4 2566 2567 3207 3208
4 3207 3208 3848 3849
4 3848 3849 4489 4490
4 4489 4490 5130 5131

4 2 3 644 645
4 644 645 1285 1286
4 1285 1286 1926 1927
4 1926 1927 2567 2568
4 2567 2568 3208 3209
4 3208 3209 3849 3850
4 3849 3850 4490 4491
4 4490 4491 5131 5132

描述:有 5 列,第一列有一个常数“4”。一个块中有 8 行(数据以空行分隔)。

现在,我的想法是将前一个块(从第 1-8 行开始)复制到第 10-17 行,并将第 2-5 列中的数字加一。这个过程(现在必须复制第 10-17 行并粘贴到第 19-27 行,第 2 -5 列必须增加 1)必须迭代大约 640 次才能生成我需要的集合。

谁能建议我如何生成这种类型的数据集?

标签: awksedvi

解决方案


$ cat tst.awk
{
    for (fldNr=1; fldNr<=NF; fldNr++) {
        flds[NR,fldNr] = $fldNr
    }
}
END {
    maxRecs = 3
    for (recNr=1; recNr<=maxRecs; recNr++) {
        for (lineNr=1; lineNr<=NR; lineNr++) {
            printf "%s", flds[lineNr,1]
            for (fldNr=2; fldNr<=NF; fldNr++) {
                printf " %s", flds[lineNr,fldNr]+(recNr-1)
            }
            print ""
        }
        print ""
    }
}

.

$ cat file
4 0 1 642 643
4 642 643 1283 12
4 1283 1284 1924 1925
4 1924 1925 2565 2566
4 2565 2566 3206 3207
4 3206 3207 3847 3848
4 3847 3848 4488 4489
4 4488 4489 5129 5130

.

$ awk -f tst.awk file
4 0 1 642 643
4 642 643 1283 12
4 1283 1284 1924 1925
4 1924 1925 2565 2566
4 2565 2566 3206 3207
4 3206 3207 3847 3848
4 3847 3848 4488 4489
4 4488 4489 5129 5130

4 1 2 643 644
4 643 644 1284 13
4 1284 1285 1925 1926
4 1925 1926 2566 2567
4 2566 2567 3207 3208
4 3207 3208 3848 3849
4 3848 3849 4489 4490
4 4489 4490 5130 5131

4 2 3 644 645
4 644 645 1285 14
4 1285 1286 1926 1927
4 1926 1927 2567 2568
4 2567 2568 3208 3209
4 3208 3209 3849 3850
4 3849 3850 4490 4491
4 4490 4491 5131 5132

只需更改maxRecs=3maxRecs=640您喜欢的任何值即可。


推荐阅读