我需要在两个字段中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] 举报,一经查实,本站将立刻删除。