bash将2个文件与公共属性合并

时间:2015-06-25 07:54:04

标签: bash file-io

我有两个文件,我想合并它们。文件如下:

文件1:

8870:0/28,13
8870:2/22,1
8870:2/25,3
887:3/29,1
886:1/40,4
886:1/41,2
886:1/43,4

文件2:

8870:0,16
8870:2,9
887:3,5
886:1,31

输出:

8870:0,16,13
8870:2,9,4
887:3,5,1
886:1,31,10

换句话说,在输出中,我希望F2添加一个与w相同的总和x:y (x:y/z,w)的列。

1 个答案:

答案 0 :(得分:1)

“我想知道如何管理这项任务。”不要怀疑,好奇并尽可能地阅读sedawk。把它所遵循的内容作为暗示。

  • 首先格式的file1转换为file2格式,丢弃不需要的内容。

    sed 's/\/.*\,/\,/' file1.txt   # here you erase what in between `/` and `,`
    

    然后用awk和关联数组

    处理它
    sed 's/\/.*\,/\,/' file1.txt  \
    | awk -F ',' '{A[$1]=A[$1]+$2}END{for (b in A) print b","A[b]}' > file1b.txt
    

    |管道重定向
    \它允许继续下一行(之后没有其他字符)
    > file1b.txt,如果您愿意,可以将所有内容重定向到新文件。

  • 现在你可以再次使用awk的关联数组和2个文件file2.txtfile1b.txt(你想要添加到file2.txt,所以你必须写它首先)

    awk -F ',' '{if (A[$1]=="" ) {A[$1]=A[$1]$2} \
    else {A[$1]=A[$1]","$2}}END{for (b in A) print b","A[b]}' \
       file2.txt file1b.txt | sort -nr
    

    最终| sort -nr按数字顺序(-r)按相反顺序(-n)对输出进行排序。

请注意,您无需创建file1b.txt

#!/bin/bash

( \
  cat file2.txt ; \
  sed 's/\/.*\,/\,/' file1.txt  |  \
  awk -F ',' '{A[$1]=A[$1]+$2}END{for (b in A) print b","A[b]}' ;
) | \
awk -F ',' '{if (A[$1]=="" ) {A[$1]=A[$1]$2} else {A[$1]=A[$1]","$2}} \
END{for (b in A) print b","A[b]}'| sort -nr