我有两个文本文件(例如text1.txt
和text 2.txt
),行数相同。例如text1.txt
包含 4 个条目
0127H
0132H
0982H
1772H
text2.txt
包含 4 个条目
stev
mary
beautiful
ugly
现在我的任务是创建 4 个文本文件
0127H.txt
包含装有stev
0132H.txt
包含装有mary
0982H.txt
包含装有beautiful
1772H.txt
包含装有ugly
即 的第一行text1.txt
必须是文件名,且对应的条目将是 的第一行text2.txt
。
我恳请您帮助我解决所提出的问题。
答案1
使用awk
,您可以执行以下操作:
awk 'FNR == NR {filename[FNR] = $0 ".txt"} FNR != NR {print > filename[FNR]}' file1 file2
FNR == NR
测试我们是否正在读取第一个文件。如果是,我们将该行保存在数组中。- 当我们读取第二个文件时,我们查找相应的数组值并将其用作输出文件。
答案2
以下一行代码可以满足您的需要:
bash -c "$(paste text1.txt text2.txt | awk '{print "echo "$2">"$1".txt"}')"
答案3
另一个python选项:
#!/usr/bin/env python3
import sys
lines = lambda f: open(f).read().splitlines()
content = lines(sys.argv[2])
for i, item in enumerate(lines(sys.argv[1])):
open(item+".txt", "wt").write(content[i])
这将创建指定的文件在运行脚本的目录中
- 另存为
combine.py
使用以下命令运行它:
python3 /path/to/combine.py <file1> <file2>
编辑
按照@queueoverflow的建议,使用zip
选项(非常简洁,甚至更短):
#!/usr/bin/env python3
import sys
lines = lambda f: open(f).read().splitlines()
for item, content in zip(lines(sys.argv[1]), lines(sys.argv[2])):
open(item+".txt", "wt").write(content)
或者
只是为了好玩;将其包含sys.argv[n]
在 lambda 函数中,进一步减少它:
#!/usr/bin/env python3
import sys
lines = lambda n: open(sys.argv[n]).read().splitlines()
[open(f+".txt", "wt").write(c) for f, c in list(zip(lines(1), lines(2)))]
答案4
我可以使用以下 bash 脚本来完成此操作:
#!/bin/bash
FILENAME="$1"
count=0
while read LINE
do
let count++
sed -n "$count"p text2 > "$LINE".txt
done < "$FILENAME"