用另一个文件的特定行/列组合替换特定的行/列组合

时间:2014-07-03 17:57:33

标签: bash awk sed

我有2个文本文件。 file1.txt,file2.txt

我需要将第3行第3行,第3列到第5列的所有字符替换为第8行到第10行,第4行到第9列的file2.txt。

为了更好地理解,我将替换文本文件的矩形区域,并在另一个文件中找到矩形区域。请注意,file2.txt中的矩形长了几列。

谢谢!

1 个答案:

答案 0 :(得分:1)

参数化解决方案:

L1  = starting line in file1
L2  = starting line in file2
N   = number of lines
F1a = starting field in file1
F1b = ending field in file1
F2a = starting field in file2
F2b = ending field in file2

awk -vL1=3 -vL2=8 -vN=3 -vF1a=3 -vF1b=5 -vF2a=4 -vF2b=9 '

    FNR == NR {
        if (FNR >= L2 && FNR < L2 + N) {
            a[FNR - L2] = $F2a
            for (i = F2a + 1; i <= F2b; ++i)
                a[FNR - L2] = a[FNR - L2] OFS $i
        }
        next
    }

    FNR >= L1 && FNR < L1 + N {
        for (i = 1; i < F1a; ++i)
            printf("%s%s", i == 1 ? "" : OFS, $i)
        printf("%s%s", F1a == 1 ? "" : OFS, a[FNR - L1])
        for (i = F1b + 1; i <= NF; ++i)
            printf("%s%s", OFS, $i)
        print""
        next
    }

    1

' file2.txt file1.txt