交错两行文本文件的行,任意行数

时间:2015-05-11 17:20:59

标签: linux text-processing

我希望将文件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"作为选项。

2 个答案:

答案 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可以轻松完成,但是......