我希望将文件A.txt的行与文件B.txt的行交错,使得在每两行A.txt之后,出现m行B.txt。例如,如果A.txt如下:
1
2
3
4
和B.txt:
a
b
c
d
n = 2且m = 1的所需输出必须如下:
1
2
a
3
4
b
简而言之,我需要的是"粘贴"实用程序的功能与任意" n"和" m"作为选项。
答案 0 :(得分:1)
我会说...
awk -v m=1 -v n=2 '
FNR==NR {a[FNR]=$0; next}
1
++count==n {for (i=0;i<m;i++) print a[++t + i]; count=0}' fb fa
这会以fileB
的方式将所有a[number of line]=content
存储在数组中。然后,它通过以下方式从fileA
之间添加行来继续打印a[]
:
count
自上次打印fileA
行以来已打印的fileB
行数count
。在m
与给定的n
匹配后,请从fileB
开始打印下一个$ awk -v m=1 -v n=2 'FNR==NR {a[FNR]=$0; next} 1; ++count==n {for (i=0;i<m;i++) print a[++t + i]; count=0}' fb fa
1
2
a
3
4
b
行。{{1}}
答案 1 :(得分:1)
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
可以轻松完成,但是......