求助,关于文件合并

发布于 2022-10-15 10:17:39 字数 772 浏览 49 评论 0

输入文件:文件A,文件B
输出文件:文件C

文件A
000000000,1,2,3
111111111,4,5,6
222222222,7,8,9
333333333,2,2,5
444444444,1,3,5

文件B
000000000,AA,BBBBBBBBBB,CCCCCCCCCC
444444444,DD,EEEEEEEEEE,HHHHHHHHHH

文件C
000000000,1,2,3,AA,BBBBBBBBBB,CCCCCCCCCC
111111111,4,5,6,△△,△△△△△△△△△△,△△△△△△△△△△
222222222,7,8,9,DD,EEEEEEEEEE,HHHHHHHHHH
333333333,2,2,5,△△,△△△△△△△△△△,△△△△△△△△△△
444444444,1,3,5,△△,△△△△△△△△△△,△△△△△△△△△△

以文件A第一个字段作为key,对文件B第一个字段进行匹配,如果相同则在文件A的当前行末尾插入文件B第一个逗号后的三个字段
如果不存在则在文件A的当前行末尾插入以空格填充的三个字段(三个字段长度分别和文件B的第一个逗号后的3个字段相同)

备注:
1.文件A和文件B第一个字段位数相同,9位
2.文件B第一个逗号后三个字段位数固定,分别为2位,10位,10位
3.文件A行数>=文件B行数
4.△代表空格

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

莫言歌 2022-10-22 10:17:39

本帖最后由 南极雨 于 2011-04-13 09:46 编辑

回复 1# johnnine

    你的意思是A B合并为C是吧 ?

  1. [root@ simple]# awk 'NR==FNR{a[$1]=a[$1] FS $2 FS $3 FS $4}NR>FNR{if($1 in a)
  2. print $1 a[$1]" "$2" " $3" "$4;else print $0}' B A
  3. 000000000 AA BBBBBBBBBB CCCCCCCCCC 1 2 3
  4. 111111111 4 5 6
  5. 222222222 7 8 9
  6. 333333333 2 2 5
  7. 444444444 DD EEEEEEEEE HHHHHHHHHH 1 3 5

复制代码

余生一个溪 2022-10-22 10:17:39

例子举的有问题吧?

  1. cat a
  2. 000000000,1,2,3
  3. 111111111,4,5,6
  4. 222222222,7,8,9
  5. 333333333,2,2,5
  6. 444444444,1,3,5
  7. cat b
  8. 000000000,AA,BBBBBBBBBB,CCCCCCCCCC
  9. 444444444,DD,EEEEEEEEEE,HHHHHHHHHH
  10. awk -F, 'NR==FNR{a[$1]=$2","$3","$4;next}{print ($1 in a)?$0","a[$1]:$0",**,**********,*********"}' b a
  11. 000000000,1,2,3,AA,BBBBBBBBBB,CCCCCCCCCC
  12. 111111111,4,5,6,**,**********,*********
  13. 222222222,7,8,9,**,**********,*********
  14. 333333333,2,2,5,**,**********,*********
  15. 444444444,1,3,5,DD,EEEEEEEEEE,HHHHHHHHHH

复制代码

短叹 2022-10-22 10:17:39

本帖最后由 wendy_85 于 2011-04-12 22:02 编辑

我比较菜 写的比较麻烦 也好使 呵呵~

  1. awk -vFS="," '
  2. NR==FNR{
  3. b[$1]=0;
  4. a[$1]=$0;
  5. }
  6. NR>FNR{
  7.   if( $1 in a)
  8.   {
  9.     a[$1]=a[$1]""FS""$2""FS""$3""FS""$4;
  10.     b[$1]=1;
  11.   }
  12. }
  13. END{
  14.   for (i in b){
  15.     if(b[i]==0){
  16.       a[i]=a[i]"FS"  "FS"          "FS"          ";
  17.     }
  18.   }
  19.   for (i in a){
  20.     print a[i];
  21.   }
  22. } ' a b

复制代码

相守太难 2022-10-22 10:17:39

遇到一个新问题。。。
如果B文件为空就,合并输出后也为空了。。

赠意 2022-10-22 10:17:39

回复 5# johnnine

    加一个判断就行了

  1. awk -F, 'NR==FNR&&FILENAME~/B/{a[$1]=$2","$3","$4;next}{print ($1 in a)?$0","a[$1]:$0",**,**********,*********"}' B A

复制代码

对你而言 2022-10-22 10:17:39

回复 6# where27

    老大,如果我BB是个变量放进去会报错,咋搞。。
FILENAME~/${BB}/{a[$1]=....

可是我不能没有你 2022-10-22 10:17:39

回复 7# johnnine

  1. awk -F, -v f1="$BB" 'NR==FNR&&FILENAME~f1{a[$1]=$2","$3","$4;next}{print ($1 in a)?$0","a[$1]:$0",**,**********,*********"}' $BB A

复制代码

最美不过初阳 2022-10-22 10:17:39

合并后的新文件拼接的位置会多出个问号。。。

小糖芽 2022-10-22 10:17:39

回复 5# johnnine

  1. ywlscpl@ubuntu:~$ cat A
  2. 000000000,1,2,3
  3. 111111111,4,5,6
  4. 222222222,7,8,9
  5. 333333333,2,2,5
  6. 444444444,1,3,5
  7. ywlscpl@ubuntu:~$ cat B
  8. 000000000,AA,BBBBBBBBBB,CCCCCCCCCC
  9. 444444444,DD,EEEEEEEEEE,HHHHHHHHHH
  10. ywlscpl@ubuntu:~$ >X
  11. ywlscpl@ubuntu:~$ awk -F ',' -v B="     " 'ARGIND==1{v=$1;sub("^"$1,"");a[v]=$0}ARGIND==2{if ($1 in a) print $0 a[$1];else print $0 FS"  "FS B B FS B B}' B A
  12. 000000000,1,2,3,AA,BBBBBBBBBB,CCCCCCCCCC
  13. 111111111,4,5,6,  ,          ,         
  14. 222222222,7,8,9,  ,          ,         
  15. 333333333,2,2,5,  ,          ,         
  16. 444444444,1,3,5,DD,EEEEEEEEEE,HHHHHHHHHH
  17. ywlscpl@ubuntu:~$ awk -F ',' -v B="     " 'ARGIND==1{v=$1;sub("^"$1,"");a[v]=$0}ARGIND==2{if ($1 in a) print $0 a[$1];else print $0 FS"  "FS B B FS B B}' X A
  18. 000000000,1,2,3,  ,          ,         
  19. 111111111,4,5,6,  ,          ,         
  20. 222222222,7,8,9,  ,          ,         
  21. 333333333,2,2,5,  ,          ,         
  22. 444444444,1,3,5,  ,          ,         
  23. ywlscpl@ubuntu:~$

复制代码

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文