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 2
file1。
输出将是:“ 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
以及键值结构的值$1
file2
要么
printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}'
使用的第一列()的键打印(使用printf
)的第一列和第二列file2
以及键值结构的值。$1
file2
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 :)