具有任意行数的两个文本文件的交错行

Interleaving lines of two text files with arbitrary number of lines

我想将文件 A.txt 的行与文件 B.txt 的行交错,这样在 A.txt 的每 n 行之后,B.txt 的 m 行显示向上。例如,如果 A.txt 类似于:

1
2
3
4

和B.txt:

a
b
c
d

n=2 和 m=1 的所需输出必须类似于:

1
2
a
3
4
b

简而言之,我需要的是一种 "paste" 实用程序的功能,具有任意 "n" 和 "m" 作为选项。

我会说...

awk -v m=1 -v n=2 '
      FNR==NR {a[FNR]=[=10=]; next}
      1
      ++count==n {for (i=0;i<m;i++) print a[++t + i]; count=0}' fb fa

这将所有 fileB 存储在一个数组中 a[number of line]=content。然后,它通过以下方式在取自 a[] 的中间添加行来继续打印 fileA

  • count 中跟踪自上次打印来自 fileB 的行以来已经打印了多少行 fileA。一旦 count 与给定的 m 匹配,就开始打印来自 fileB.
  • 的下 n

测试

$ awk -v m=1 -v n=2 'FNR==NR {a[FNR]=[=11=]; next} 1; ++count==n {for (i=0;i<m;i++) print a[++t + i]; count=0}' fb fa
1
2
a
3
4
b

bash 解决方案的开始 - 没有错误检查,特别是对于其中一个文件的文件早期结束;你必须决定你想如何处理它,因为你的问题有点含糊...

exec 3< fileA 4< fileB

while true
do
  for i in `seq M`
  do
    read -u 3 line
    echo "${line}"
  done

  for i in `seq N`
  do
    read -u 4 line
    echo "${line}"
  done
done

exec 3<&- 4<&-

这至少可以避免一次将整个文件加载到内存中的需要。这个概念可以很容易地翻译成 Python 或 perl 或其他几种脚本语言之一,其中错误检查逻辑比 bash 更容易实现。不太确定 awk 是否可以轻松完成,但...