微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在unix中的两个文件上留下外连接

我需要在两个字段中join两个文件。 不过,我应该检索文件1中的所有值,即使连接失败,像一个左外连接。

文件1:

01|a|jack|d 02|b|ron|c 03|d|tom|e

文件2:

01|a|nemesis|f 02|b|brave|d 04|d|gorr|h

输出

合并/join文件* .001,* .002,* .003 ..不复制到新的一个

Linux连接实用程序抱怨input文件未被sorting

在Linux上join两个文件

Bashjoin命令

join多个文件

01|a|jack|d|nemesis|f 02|b|ron|c|brave|d 03|d|tom|e||

使用Unix JOIN命令合并两个文件

bashjoin多个带空replace的文件(-e选项)

Bash:join数字列

在Windows中join相当于

unixjoin分隔符char

这是join -t '|' file1 file2 -a1 join -t '|' file1 file2 -a1

使用的选项:

t – >分隔符

a – >确定不成对的行必须打印的文件编号。

join -t '|' file1 file2 -a2 join -t '|' file1 file2 -a2会做一个正确的外部连接

示例运行

[aman@aman test]$ cat f1 01|a|jack|d 02|b|ron|c 03|d|tom|e [aman@aman test]$ cat f2 01|a|nemesis|f 02|b|brave|d 04|d|gorr|h [aman@aman test]$ join -t '|' f1 f2 -a1 01|a|jack|d|a|nemesis|f 02|b|ron|c|b|brave|d 03|d|tom|e

要做的事情问题是比以前的答案有点复杂,并需要这样的事情:

sed 's/|/:/2' file1 | sort -t: >file1.tmp sed 's/|/:/2' file2 | sort -t: >file2.tmp join -t':' file1.tmp file2.tmp -a1 -e'|' -o'0,1.2,2.2' | tr ':' '|'

Unix连接只能加入单个字段AFAIK,因此必须使用使用不同分隔符的文件“在两个字段上连接两个文件 ”,在本例中为前两个字段。 我将使用冒号但是,如果在任何输入中都存在需要使用其他内容的情况,例如制表符可能是生产使用的更好选择。 我也重新排序新的复合字段sort -t:的输出,这对于示例输入文件没有什么区别,但是对于真实世界的数据。 sed 's/|/:/2'用文件中每一行的冒号代替管道的第二次出现。

file1.tmp

01|a:jack|d 02|b:ron|c 03|d:tom|e

file2.tmp

01|a:nemesis|f 02|b:brave|d 04|d:gorr|h

现在我们使用由tr过滤的join输出和更高级的选项:

-t':'指定临时冒号分隔符

-a1左外连接

-e'|' 指定失败连接的替换字符串,基本上是最终输出定界符N-1次,其中N是在file2.tmp中冒号右侧连接的管道分隔字段的数目。 在这种情况下,N = 2是一个管道字符。

-o'0,2.2'指定输出格式:

0连接字段

1.2 file1.tmp的字段2,即冒号的所有内容

2.2 file2.tmp的字段2

tr ':' '|' 最后,我们将冒号转换回管道进行最终输出

输出现在匹配问题示例输出正是前一个答案没有做的:

01|a|jack|d|nemesis|f 02|b|ron|c|brave|d 03|d|tom|e||

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐