免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3940 | 回复: 11

awk 问题 [复制链接]

论坛徽章:
0
发表于 2010-11-03 15:18 |显示全部楼层
10可用积分
文本内容1

a|1|acd|123
a|2|ccc|345
d|3|abc|563


文本内容2(是描述文本1中每个列的字段名)
test1
test2
test3
test4


我想实现将文本1中的内容替换成如下形式

{"test1":a,"test2":1,"test3":acd,"test4":123}
{"test1":a,"test2":2,"test3":ccc,"test4":345}
{"test1":d,"test2":3,"test3":abd,"test4":563}

论坛徽章:
0
发表于 2010-11-03 15:18 |显示全部楼层
  1. 4K.Grubby@ubuntu:~$ cat a
  2. a|1|acd|123
  3. a|2|ccc|345
  4. d|3|abc|563
  5. 4K.Grubby@ubuntu:~$ cat b
  6. test1
  7. test2
  8. test3
  9. test4
  10. 4K.Grubby@ubuntu:~$ awk -F\| -v v='"' 'NR==FNR{T=FNR;a[T]=$0;next}{for(i=1;i<=T;i++)$i=v a[i] v":"$i;sub($0,"{"$0"}")}1' OFS="," b a
  11. {"test1":a,"test2":1,"test3":acd,"test4":123}
  12. {"test1":a,"test2":2,"test3":ccc,"test4":345}
  13. {"test1":d,"test2":3,"test3":abc,"test4":563}
复制代码

论坛徽章:
0
发表于 2010-11-03 15:42 |显示全部楼层
本帖最后由 lkk2003rty 于 2010-11-03 15:43 编辑
  1. awk 'BEGIN{FS="|"}FNR==NR{a[FNR]=$0;next}{printf "{";for(i=1;i<NF;i++)printf "\"%s\":%s,",a[i],$i;printf "\"%s\":%s",a[i],$NF;printf "}\n"}' file2 file1
复制代码

论坛徽章:
0
发表于 2010-11-03 16:23 |显示全部楼层
如果我想把文本2的内容存在一个数组里,传到awk里,实现相同的功能。
而不是让awk读两个文本,这个要怎么写呢?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2010-11-03 19:09 |显示全部楼层
  1. [root@branchtest_bak:/]#cat file
  2. a b
  3. c d
  4. e f
  5. g g
  6. a b
  7. c d
  8. e f
  9. g g
  10. a b
  11. c d
  12. e f
  13. g g
  14. [root@branchtest_bak:/]#set -A month Jan Feb Mar Apr May Jun Jul Aug Sep Otc Nov Dec
  15. [root@branchtest_bak:/]#echo ${month[@]}
  16. Jan Feb Mar Apr May Jun Jul Aug Sep Otc Nov Dec
  17. [root@branchtest_bak:/]#echo ${month[@]} |awk 'NR==FNR{for(i=1;i<=NF;i++){a[i]=$i}}NR!=FNR{print a[FNR],$0}' - file
  18. Jan a b
  19. Feb c d
  20. Mar e f
  21. Apr g g
  22. May a b
  23. Jun c d
  24. Jul e f
  25. Aug g g
  26. Sep a b
  27. Otc c d
  28. Nov e f
  29. Dec g g
  30. [root@branchtest_bak:/]#
复制代码

论坛徽章:
0
发表于 2010-11-03 19:35 |显示全部楼层
  1. awk -F"|" 'BEGIN{OFS=","} NR==FNR{line[NR]=$0} NR!=FNR{print "{\""line[1]"\""":"$1, "\""line[2]"\""":"$2, "\""line[3]"\""":"$3, "\""line[4]"\""":"$4"}"}' file2 file1
复制代码
期待更优雅的解法

论坛徽章:
0
发表于 2010-11-03 20:30 |显示全部楼层

  1. 用sed来一个
  2. a=$(sed -r ':a;N;$!ba;s/^.*$/"&":%s/mg;s/\n/,/g;s/.*/{&}/' file2)
  3. sed "s/[|]/ /g;s/.*/printf '$a' &/e" file1
复制代码

论坛徽章:
0
发表于 2010-11-03 22:32 |显示全部楼层
awk -F '|' 'NR==FNR{a[FNR]=$0}NR>FNR{for(i=1;i<=NF;i++){$i="\""a[i]"\""":"$i};print "{"$0"}"}' e d
做了一下

论坛徽章:
0
发表于 2010-11-03 22:33 |显示全部楼层
回复 7# springwind426


    学习

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2010-11-04 14:11 |显示全部楼层
试试这个,呵呵

awk '{print "{|"$0"}"} ' file1 | sed 's/|/,|:/g' | sed 's/,//' > file3

for i in $(cat file2); do sed 's/|/\"'$i'\"/ ' file3 > tem; cat tem >file3; done

cat file3

{"test1":a,"test2":1,"test3":acd,"test4":123}
{"test1":a,"test2":2,"test3":ccc,"test4":345}
{"test1":d,"test2":3,"test3":abc,"test4":563}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP