Answers:
join如果文件按示例排序,则该命令几乎可以满足您的需要:
join -12 -a2 file1 file2 -o2.1,2.2,1.1
您只需要将零添加到不匹配的行即可。您可以-e为此使用开关:
join -12 -a2 file1 file2 -o2.1,2.2,1.1 -e0
使用join:
join -1 1 -2 2 -a1 -e0 -o'0,1.2,2.1' file2 file1
join命令将共享公共数据字段的两个文件的行合并在一起。在这种情况下:使用file2的字段1(-1 1)和file1的字段2()连接file2和-2 2file1。
输出将是:“ joined字段,file2的字段2,file1的字段1”(-o'0,1.2,2.1'),如果缺少字段,则放置0(-e0)
如果两个文件之一具有更多记录,则添加它们(在本例中为file2)(-a1)
请参考命令join的手册页
一点awk魔术:
awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0}; \
printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}' \
file1 file2
要么
awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0};
print $1,$2,a[$1]}' file1 file2
输出量
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0
说明
FNR==NR{a[$2]=$1;next}
运行file1(FNR==NR)并创建键值结构。键是的第二列($2)file1,值是的第一列($1)file1
{if(a[$1]==""){a[$1]=0};print $1,$2,a[$1]}
在运行file2和
if(a[$1]==""){a[$1]=0}
如果第一列($1)中的键在file2中不存在file1,我们需要0
print $1,$2,a[$1]
使用的第一列()的键打印(使用print)的第一列和第二列file2以及键值结构的值$1file2
要么
printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}'
使用的第一列()的键打印(使用printf)的第一列和第二列file2以及键值结构的值。$1file2
FS 是列之间的分隔符,取自输入文件
"%s%s%s%s%s\n"
是输出的格式
%s -弦
\n - 新队
使用q:
$ q "select f2.c1, f2.c2, ifnull(f1.c1,0) from file_2.txt f2 LEFT JOIN file_1.txt f1 on f1.c2 = f2.c1 "
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0
有时这种方式可能更具可读性。
q都在包python3-q-text-as-data(Python 3)和包python-q-text-as-data(Python 2)中。
q包裹?我似乎无法安装python-q-text-as-data或python3-q-text-as-data。“ E:无法找到软件包python3-q-text-as-data”。我的系统已经安装python,python2.7,python3,和python3.4。
-e0不需要的perl :)