如何用不同的行数交错两个txt文件

如何用不同的行数交错两个txt文件

文件1.txt:

1
2
3
4
5
6

文件2.txt:

A
B
C
D
E

所需的输出比例为 3:1 (file3.txt)

1
2
3
A
4
5
6
B

我尝试过的命令:

  1. sed Rfile2.txt file1.txt >file3.txt
  2. paste -d '\n' file1.txt file2.txt >file3.txt

答案1

paste

paste -d '\n' <file1.txt - - - file2.txt

尽管在其中一个文件耗尽后,如果另一个文件中仍留有行(如示例中所示),它会继续输出行。

awk

awk '{print}; NR % 3 == 0 {getline < "file2.txt"; print}' file1.txt

或者 GNUsed等效项:

sed '3~3 R file2.txt' file1.txt

这次,一旦耗尽就停止,但如果耗尽file1.txt仍然继续(并在变体中输出空行,在 GNU变体中不输出任何内容)。file2.txtawksed

一旦任一文件耗尽就停止:

awk '{print}
     NR % 3 == 0 {
       if ((getline < "file2.txt") <= 0) exit
       print
     }' file1.txt

答案2

$ awk '{print} (FNR % 3)==0{getline<"file2.txt"; print}' file1.txt
1
2
3
A
4
5
6
B

怎么运行的

  • print

    这将打印 file1.txt 中的每一行。

  • (FNR % 3)==0{ getline <"file2.txt"; print}

    每隔三行,打印 file2.txt 中的一行。

选择

有些人强烈反对使用 awk getline。在这种情况下:

$ awk 'FNR==NR{a[NR]=$0;next} {print} (FNR % 3)==0{print a[FNR/3]}' file2.txt file1.txt
1
2
3
A
4
5
6
B

怎么运行的

  • FNR==NR{a[NR]=$0;next}

    在读取第一个文件 时file2.txt,我们将其行保存在数组中a,然后跳过其余命令并跳转到next输入行。

  • print

    如果我们已经到达这里,那么我们正在读取第二个文件,file1.txt并打印它的行。

  • (FNR % 3)==0 {print a[FNR/3]}

    如果 file 中的行号file1.txt是 3 的偶数倍,那么我们打印file2.txt行号为 中当前行三分之一的文件中的行file1.txt

答案3

使用Python:

代码:

with open(sys.argv[1], 'rU') as f1, open(sys.argv[2], 'rU') as f2:
    while f1 or f2:
        for i, line in enumerate(f1):
            print line.strip()
            if i == 2:
                break
        if f2:
            try:
                print(next(f2).strip())
            except StopIteration:
                f2 = None

结果:

1
2
3
A
4
5
6
B

相关内容