使用公共列合并文件


8

我有两个文件,我要创建其中包含所有信息的第三个文件。

文件1:

a 111 
b 222 
c 333 
d 666 
e 777 

文件2:

111 x1  
222 x2
333 x3
444 x4 
555 x5 
666 x6 
777 x7 
888 x8

我想将它们合并如下:

111  x1  a
222  x2  b
333  x3  c
444  x4  0
555  x5  0
666  x6  d
777  x7  e
888  x8  0

注意:

文件1的第二列是文件2的第一列的子集

Answers:


7

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

如果您添加了-e0不需要的perl :)
LilloX 2015年

@LilloX:好的,谢谢。我尝试过但失败了(典型)。
choroba 2015年

13

使用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的手册页


好。您能补充一点解释吗?
Lety 2015年

当然,已更新:)
LilloX 2015年

5

一点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}

    运行file1FNR==NR)并创建键值结构。键是的第二列($2file1,值是的第一列($1file1

  • {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 - 新队


您能解释一下代码吗?
gforce89

当然,答案已更新。
AB

1

使用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

有时这种方式可能更具可读性。


1
对于任何想知道的人,它q都在包python3-q-text-as-data(Python 3)和包python-q-text-as-data(Python 2)中。
kos 2015年

谢谢,但是我在哪里可以得到这个q包裹?我似乎无法安装python-q-text-as-datapython3-q-text-as-data。“ E:无法找到软件包python3-q-text-as-data”。我的系统已经安装pythonpython2.7python3,和python3.4
帕迪·兰道

程序包可能太新了,在您的发行版本中不可用。您可以克隆它Github:github.com/harelba/q
Vi。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.