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
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
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
awk -F'|' '{s=$0;sub(/\|$/,"",s);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|
复制代码
作者:
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
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