从其他文本文件创建文本文件

从其他文本文件创建文本文件

我有一个像这样的文本文件

word_1 root_of_word_A
word_2 root_of_word_B
word_3 root_of_word_C
word_4 root_of_word_A

和其他类似的文件

root_of_word_A root_of_word_1
root_of_word_B root_of_word_2
root_of_word_C root_of_word_3

我必须将第一个文档中的其他单词替换为第二个文档中的其他单词,如下所示

word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1

我想我可以用 awk 做这样的事情。我试过这个:

awk 'NR==FNR {print $1}{c[$2]++;next};c[$1]>0{print $2}' file1 file2

问题是我不知道如何打印 file1 的第一列和 file2 的第二列。

提到第一个文件和第二个文件的行数不同,并且只有一个示例可以更清楚地说明我想要做的事情(问题不是将 A 转换为 1,而是整个 root_of_the_word)。

答案1

如果 中 的单词file2是唯一的,那么您可以颠倒文件的顺序,从中构建一个数组file2并将其应用到file1

$ awk 'NR==FNR{a[$1]=$2;next}{print $1,a[$2]}' file2 file1
word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1

答案2

您正在执行关系连接操作。有一个标准的 Unix 命令可以做到这一点:join我希望更多的人知道这个奇妙的工具!

join命令在公共字段上连接两个文件。但是,这两个文件需要在该字段上进行排序。

公共字段是第一个文件的字段 2 ( file1.txt) 和第二个文件的字段 1 ( file2.txt)。按这些字段对文件进行排序:

$ sort -k2,2 -o file1.txt file1.txt
$ sort -k1,1 -o file2.txt file2.txt

然后对这些字段执行联接(请阅读 的手册join),指定我们只想将第一个文件中的字段 1 和第二个文件中的字段 2 作为输出,并对结果进行排序(如果需要):

$ join -1 2 -2 1 -o 1.1,2.2 file1.txt file2.txt | sort
word_1 root_of_word_1
word_2 root_of_word_2
word_3 root_of_word_3
word_4 root_of_word_1

相关内容