我有两个文件,我想合并它们。文件如下:
文件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)
的列。
答案 0 :(得分:1)
“我想知道如何管理这项任务。”不要怀疑,好奇并尽可能地阅读sed
和awk
。把它所遵循的内容作为暗示。
首先将格式的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.txt
和file1b.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