Chinaunix

标题: linux 两个文件列合 并求大神 [打印本页]

作者: chenteng168    时间: 2016-06-20 17:24
标题: linux 两个文件列合 并求大神
写个简单的例子(两个文件第三个"|"之前的数据是一样的且排好序的,只需把第二个文件第三个"|"后面的内容拼接到第一个文件每列的后面):

a.txt
1|2|3|a|b|c|d
3|2|1|aa|dd|bb

b.txt
1|2|3|e|f|g
3|2|1|cc|dd|aa

把上面两个文件合并成以下内容
1|2|3|a|b|c|d|e|f|g
3|2|1|aa|dd|bb|cc|dd|aa
作者: Herowinter    时间: 2016-06-20 17:39
回复 1# chenteng168

都是以前3个列作为key 来合并两个文件吗?
   
作者: haooooaaa    时间: 2016-06-20 17:41
  1. awk -vFIELDWIDTHS="5 100" 'NR==FNR{a[$1]=$2;next}{print $1 a[$1] $2}' a b
复制代码

作者: jason680    时间: 2016-06-20 17:42
回复 1# chenteng168

$ awk -F'|' '{s=$0;getline <"b.txt";for(n=4;n<=NF;++n)s=s"|"$n;print s}' a.txt
1|2|3|a|b|c|d|e|f|g
3|2|1|aa|dd|bb|cc|dd|aa

   
作者: huazai0715    时间: 2016-06-20 18:21
本帖最后由 huazai0715 于 2016-06-20 18:22 编辑

#!/usr/bin/python
l1=[]
l2=[]
l3 = []
l4 = []
with open('a.txt') as f:
        for i in f.readlines():
                i = i.strip('\n')
                l1.append(i.split('|'))
with open('b.txt') as f1:
        for i in f1.readlines():
                i = i.strip('\n')
                l2.append(i.split('|'))

        l3 = sorted(set(l1[0] + l2[0]))
        l4 = sorted(set(l1[1] + l2[1]))
        print('|'.join(l3))
        print('|'.join(l4))
作者: 99超人    时间: 2016-06-20 19:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: moperyblue    时间: 2016-06-21 07:34
  1. paste a.txt b.txt|sed -r 's/\s+[^|]*(\|[^|]*){2}//'
复制代码

作者: chenteng168    时间: 2016-06-21 09:17
谢谢回复的每位朋友,非常感谢,我采用了:jason680   的AWK方式
作者: chenteng168    时间: 2016-06-21 16:22
回复 4# jason680

现在出现另一个问题,就是a,b文件中每一行最后面多了一个“|”,
a.txt
1|2|3|a|b|c|d|
3|2|1|aa|dd|bb|

b.txt
1|2|3|e|f|g|
3|2|1|cc|dd|aa|
执行:awk -F'|' '{s=$0;getline <"b.txt";for(n=4;n<=NF;++n)s=s"|"$n;print s}' a.txt
结果:
1|2|3|a|b|c|d||e|f|g
3|2|1|aa|dd|bb||cc|dd|aa
第一条d后面多了一个“|”
第二条bb后面多也一个“|”

需要把上面两个文件合并成以下内容
1|2|3|a|b|c|d|e|f|g
3|2|1|aa|dd|bb|cc|dd|aa
   
作者: Herowinter    时间: 2016-06-21 16:35
回复 9# chenteng168

  1. awk -F'|' '{s=$0;sub(/\|$/,"",s);getline <"b.txt";for(n=4;n<=NF;++n)s=s"|"$n;print s}' a.txt
  2. 1|2|3|a|b|c|d|e|f|g|
  3. 3|2|1|aa|dd|bb|cc|dd|aa|
复制代码

作者: chenteng168    时间: 2016-06-21 16:38
回复 10# Herowinter


    非常感谢解决了!
我刚把之前的改了下也可以:awk -F'|' '{s=$0;getline <"b.txt";for(n=4;n<NF;++n)s=s$n"|";print s}' a.txt
作者: sunzhiguolu    时间: 2016-06-21 16:43
  1. perl -nle 'if(/((?:\d\|){3})(\N+)/){$k=$1;$v=$2}@ARGV?($h{$k}=$v):do{print $k,$h{$k},$v}' a b
复制代码
1|2|3|a|b|c|de|f|g
3|2|1|aa|dd|bbcc|dd|aa

作者: hz_oracle    时间: 2016-06-21 17:19
awk -F"|" 'NR==FNR{s=$0}NR>FNR{print s"|"$4"|"$5"|"$6}' a.txt b.txt
作者: wjemail    时间: 2016-06-22 11:41
# sed -e 's/|/| /3; s/$/|&/' a.txt >a.new

# sed -e 's/|/| /3' b.txt >b.new
# join a.new b.new | sed 's/| /|/g'
1|2|3|a|b|c|d|e|f|g
3|2|1|aa|dd|bb|cc|dd|aa

麻烦点儿,先创造两个新文件,在1|2|3|后面插入空格,然后join这两个新文件。
作者: 我是一隻羊    时间: 2016-06-22 13:17
本帖最后由 我是一隻羊 于 2016-06-22 13:19 编辑

回错帖子了不好意思~
作者: 97251230    时间: 2016-07-27 10:15
看了这个贴,好牛逼。。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2