联接/合并/合并两个Unix文件,两个文件中的所有列都应显示在output [closed]中

mm9b1k5b  于 2022-11-23  发布在  Unix
关注(0)|答案(1)|浏览(149)

已关闭。此问题需要更多focused。当前不接受答案。
**想要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。

4天前关闭。
Improve this question
我想在Unix中合并两个文件,其中字段由管道符号分隔,两个文件都有以下示例格式的数据。
档案一:

AA|AAA|DECIMAL
BB|BBB|varchar2(20)
CC|CCC|Date

档案二:

AA|AAA|varchar2(20)
DD|DDD|varchar2(30)
EE|EEE|Date

预期输出:

AA|AAA|DECIMAL   AA|AAA|varchar2(20)
BB|BBB|varchar2(20)  MISSING
CC|CCC|Date          MISSING
MISSING          DD|DDD|varchar2(30)
MISSING              EE|EEE|Date

请告诉我如何在unix中实现这一点。Awk或任何命令都可以。提前感谢您的建议。
我尝试使用awk、join和paste命令,但无法获得预期的输出。

l7mqbcuq

l7mqbcuq1#

我将利用GNU AWK来完成这个任务,如下所示,让file1.txt内容

AA|AAA|DECIMAL
BB|BBB|varchar2(20)
CC|CCC|Date

file2.txt含量是

AA|AAA|varchar2(20)
DD|DDD|varchar2(30)
EE|EEE|Date

然后

awk 'BEGIN{FS="|"}{arr[$1][FNR!=NR]=$0}END{for(i in arr){print (0 in arr[i])?arr[i][0]:"MISSING",(1 in arr[i])?arr[i][1]:"MISSING"}}' file1.txt file2.txt

给出输出

AA|AAA|DECIMAL AA|AAA|varchar2(20)
BB|BBB|varchar2(20) MISSING
CC|CCC|Date MISSING
MISSING DD|DDD|varchar2(30)
MISSING EE|EEE|Date

说明:我告诉GNU AWK字段分隔符(FS)是管道(|),然后我构建了二维数组arr,其中key是(第1列,0(如果是第一个文件),1(如果是第二个文件),我储存了整条线($0)作为值。文件处理完成后,我迭代数组的第一维,如果0出现在第二维,我使用值,否则MISSING和如果1存在于第二维,我使用值MISSING,否则使用print,使用默认的单空格输出字段分隔符。如果你想了解更多关于二维数组的信息,请阅读Multidimensional

  • (在GNU Awk 5.0.1中测试)*

如果您希望将结果输出到column -t,即

awk 'BEGIN{FS="|"}{arr[$1][FNR!=NR]=$0}END{for(i in arr){print (0 in arr[i])?arr[i][0]:"MISSING",(1 in arr[i])?arr[i][1]:"MISSING"}}' file1.txt file2.txt | column -t

将给予输出

AA|AAA|DECIMAL       AA|AAA|varchar2(20)
BB|BBB|varchar2(20)  MISSING
CC|CCC|Date          MISSING
MISSING              DD|DDD|varchar2(30)
MISSING              EE|EEE|Date

相关问题