![如何用不同的行数交错两个txt文件](https://linux22.com/image/116672/%E5%A6%82%E4%BD%95%E7%94%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E8%A1%8C%E6%95%B0%E4%BA%A4%E9%94%99%E4%B8%A4%E4%B8%AAtxt%E6%96%87%E4%BB%B6.png)
文件1.txt:
1
2
3
4
5
6
文件2.txt:
A
B
C
D
E
所需的输出比例为 3:1 (file3.txt)
1
2
3
A
4
5
6
B
我尝试过的命令:
sed Rfile2.txt file1.txt >file3.txt
paste -d '\n' file1.txt file2.txt >file3.txt
答案1
和paste
:
paste -d '\n' <file1.txt - - - file2.txt
尽管在其中一个文件耗尽后,如果另一个文件中仍留有行(如示例中所示),它会继续输出行。
和awk
:
awk '{print}; NR % 3 == 0 {getline < "file2.txt"; print}' file1.txt
或者 GNUsed
等效项:
sed '3~3 R file2.txt' file1.txt
这次,一旦耗尽就停止,但如果耗尽file1.txt
仍然继续(并在变体中输出空行,在 GNU变体中不输出任何内容)。file2.txt
awk
sed
一旦任一文件耗尽就停止:
awk '{print}
NR % 3 == 0 {
if ((getline < "file2.txt") <= 0) exit
print
}' file1.txt
答案2
$ awk '{print} (FNR % 3)==0{getline<"file2.txt"; print}' file1.txt
1
2
3
A
4
5
6
B
怎么运行的
print
这将打印 file1.txt 中的每一行。
(FNR % 3)==0{ getline <"file2.txt"; print}
每隔三行,打印 file2.txt 中的一行。
选择
有些人强烈反对使用 awk getline
。在这种情况下:
$ awk 'FNR==NR{a[NR]=$0;next} {print} (FNR % 3)==0{print a[FNR/3]}' file2.txt file1.txt
1
2
3
A
4
5
6
B
怎么运行的
FNR==NR{a[NR]=$0;next}
在读取第一个文件 时
file2.txt
,我们将其行保存在数组中a
,然后跳过其余命令并跳转到next
输入行。print
如果我们已经到达这里,那么我们正在读取第二个文件,
file1.txt
并打印它的行。(FNR % 3)==0 {print a[FNR/3]}
如果 file 中的行号
file1.txt
是 3 的偶数倍,那么我们打印file2.txt
行号为 中当前行三分之一的文件中的行file1.txt
。
答案3
使用Python:
代码:
with open(sys.argv[1], 'rU') as f1, open(sys.argv[2], 'rU') as f2:
while f1 or f2:
for i, line in enumerate(f1):
print line.strip()
if i == 2:
break
if f2:
try:
print(next(f2).strip())
except StopIteration:
f2 = None
结果:
1
2
3
A
4
5
6
B