我有一个像这样的文本文件
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