转自:http://blog.chinaunix.net/uid-20754793-id-177777.html
有两个文件需要合并,开始写了脚本实现,忽然发现join命令能够完全替代,总结了一下join的基本用法
linux常用命令系列—join 文档内容合并
指令名称:join
功能介绍:找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。join强大呀,像sql里 面的join 呢.join工作方式。这里有两个文件f i l e 1和f i l e 2,当然已经分类。每个文件里都有一些元素与另一个文件相关。由于这种关系, join将两个文件连在一起,这有点像修改一个主文件,使之包含两个文件里的共同元素。
语法格式:
join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或 2>][-1<栏位>][-2<栏位>][--help][--version][文件1][文件2]
常用参数说明:
-a<1或2> 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。
-e<字符串> 若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。
-i或--igore-case 比较栏位内容时,忽略大小写的差异。
-o<格式> 按照指定的格式来显示结果。
-t<字符> 使用栏位的分隔字符。
-v<1或2> 跟-a相同,但是只显示文件中没有相同栏位的行。
-1<栏位> 连接[文件1]指定的栏位。
-2<栏位> 连接[文件2]指定的栏位。
--help 显示帮助。
--version 显示版本信息。
举例:创建文件发file1和file2内容如下:
file1:
1 aaaaaaaa 2 bbbbbbbb 3 cccccccccc
|
file2:
1.将两个文件 内容相同的行连接起来
$join file1 file2 1 aaaaaaaa 1111111111 2 bbbbbbbb 2222222222
|
$join file2 file1 1 1111111111 aaaaaaaa 2 2222222222 bbbbbbbb
|
2显示第一个文件第二个域,第二个文件第二个域
$join -o 1.2 2.2 file1 file2 aaaaaaaa 1111111111 bbbbbbbb 2222222222
|
3 显示第一个文件不匹配的行
其他选项用到时再写出
$join -a1 file1 file2 1 aaaaaaaa 1111111111 2 bbbbbbbb 2222222222 3 cccccccccc
|
向file2添加新内容如下
1 1111111111 2 2222222222 4 4444444444
|
显示第二个文件不匹配的行
1 aaaaaaaa 1111111111 2 bbbbbbbb 2222222222 4 4444444444
|
合并两个文件脚本如下:
#!/bin/bash
#
# Script: merge_print.sh
# Author: CaoJiangfeng
# Date: 2010-09-25 11:38:57 AM
# Purpose: This script is used to merge two files in common
# Version: 1.0
#
################################################################
################ Define some variables here ##################
################################################################
# Define some global variables
FILE1="file1" FILE2="file2" TARGET=tmp ################################################################
################ Define some functions here ##################
################################################################
function merge { cat /dev/null >$TARGET #Intialize a null file
while read line1 do l1=`echo "$line1" |awk '{print $1}'` while read line2 do l2=`echo "$line2" | awk '{print $1}'` if [ $l1 -eq $l2 ]; then echo -n $line1>>$TARGET echo "$line2" | awk '{print " "$2}'>>$TARGET fi done<$FILE2 done <$FILE1 } ################################################################
################ Start of main ##################
################################################################
merge more $TARGET | sort -r # Print the result
# clean
rm -f $TARGET exit 0
|