访问文本文件的各个行并创建具有该名称的单独文本文件

访问文本文件的各个行并创建具有该名称的单独文本文件

我有两个文本文件(例如text1.txttext 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"

相关内容