通过在偶数行的其他文件之后插入一个文件的偶数行来组合两个文件

时间:2017-05-09 00:07:48

标签: file awk sed concatenation

我想知道一种有效组合两个文件的方法。我想在FileB的偶数行之后仅连接FileA的偶数行。我认为可以用sed或awk轻松完成。任何帮助表示赞赏。

FILEA:

A1
A2
A3
A4
A5
A6
.
.

FILEB:

B1
B2
B3
B4
B5
B6
.
.

输出:

A1
A2
B2
A3
A4
B4
A5
.

4 个答案:

答案 0 :(得分:2)

awk救援!

awk 'NR==FNR {b[NR]=$0; next} 1; !(FNR%2){print b[FNR]}' fileB fileA

如果文件很大,您可以通过仅存储fileB的打印行来剪切数组大小。

答案 1 :(得分:2)

这是一种避免将其中一个文件存储在内存中的方法:

awk -v f=FileB '{print} NR%2==0 {getline<f; getline<f; print}' FileA

工作原理:

  • -v f=FileB

    这会创建一个awk变量f,其中包含FileB的名称。

  • {print}

    这将打印从FileA读取的每一行。

  • NR%2==0 {getline<f; getline<f; print}

    如果我们在偶数行上,意思是NR%2==0,那么我们从FileB读取两行并打印第二行。

示例输出:

$ awk -v f=FileB '{print} NR%2 == 0{getline<f; getline <f; print}' FileA
A1
A2
B2
A3
A4
B4
A5
A6
B6

更神秘的版本

Awk允许使用神秘的简写符号执行打印:

awk -v f=FileB '1; NR%2{next} {getline<f; getline <f} 1' FileA

此处,1条件,其评估为true。由于未指定操作,因此执行默认操作即打印该行。

答案 2 :(得分:2)

您可以合并paste,sed和进程替换:

$ paste -d '\n' <(sed '2~2d' fileA) <(sed '1~2d' fileA) <(sed '1~2d' fileB)
A1
A2
B2
A3
A4
B4
A5
A6
B6

说明:

  • paste -d '\n'逐行粘贴文件,由换行符分隔,有效地交错它们
  • sed '2~2d' fileA打印fileA的奇数行(通过删除偶数行)
  • sed '1~2d' fileA打印fileA
  • 的偶数行
  • sed '1~2d' fileB打印fileB
  • 的偶数行

答案 3 :(得分:2)

这可能适合你(GNU sed);

sed '1~2d' fileB | sed '2~2R /dev/stdin' fileA

在偶数行上过滤fileB,并通过管道将结果文件传递给sed的第二次调用,将这些行仅附加到fileA中的偶数行。