合并两个文件中的备用行


9

文件1:

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

文件2:

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

输出文件:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

2
始终提及您的操作系统。许多标准工具在不同的操作系统上的行为有所不同,因此我们需要了解您使用的是什么。
terdon

Answers:




5

paste解决方案是最便携式,最有效的。在两个文件的行数不相同的情况下,如果您更喜欢它的行为,那么我仅提及此替代方法:

使用GNU sed

sed Rfile1 file2

如果file1行数少于file2,则在file1用尽时sed将不会为其输出任何内容(与的空行相对paste)。

如果file1有更多的行数比file2,则这些额外的线路将被丢弃(相对于打印空行对于file2paste)。

$ paste a b
1       a
2       b
3
4
$ paste -d \\n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2

4

使用awkgawknawkmawk):

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}NR==FNR仅当当前记录号等于当前文件记录号时才匹配(因此仅在处理第一个文件时才匹配):将当前处理的记录x以等于当前文件记录号的索引存储到数组中,并跳过当前记录
  • {print x[FNR]"\n"$0}x在与当前文件记录编号相等的索引处打印数组的内容,后跟换行符和当前记录的内容
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

它提供的输出与我想要的输出不完全相同。我的输出文件中的tid.setnr行之后是tid.info行。
pmaipmui 2015年

@Nainita这就是您在示例输出中显示的内容。
kos 2015年

@Nainita反正切换你可以切换输出的顺序file1,并file2在命令。
kos 2015年

是的...我做过同样的事情,但它的打印方式与以前完全一样。在打印tid.setnr之后,它正在对tid.info进行扫描。
pmaipmui 2015年

1
@mikeserv但是,由于我也曾尝试过mawk,因此它也可以在其上运行。反正是合理的,我不能明白为什么它不应该工作只是周围的其他方法(即通过切换文件)。不是awk在乎输入,线就是线。如果他的版本不支持某些功能,那将是第一次中断。更简单的方法是,OP只是在切换参数中的输入文件时出错。
kos 2015年

-1

下面给出最简单的解决方案。

cat file1 >> file2

要么

cat file2 >> file1

1
萨钦,再读一次问题;这会将一个文件的内容附加到另一文件的内容。它不会合并交替排列的文件(因此,从一行file1再到一行file2,依此类推...)
don_crissti
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.