具有任意行数的两个文本文件的交错行
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
是否可以轻松完成,但...
我想将文件 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
是否可以轻松完成,但...