Chinaunix

标题: 文本处理_如何实现某列两个数字间相差多少就插入多少空行 [打印本页]

作者: hechao7021    时间: 2019-02-20 10:38
标题: 文本处理_如何实现某列两个数字间相差多少就插入多少空行
a.txt
1 1006 + 0 2 CHH CCC U L L L L L
1 1007 + 0 2 CHH CCT U L L L L L
1 1008 + 0 2 CHH CTA U L L L L L
1 1013 + 0 2 CHH CCC U L L L L L
1 1014 + 0 2 CHH CCT U L L L L L
1 1015 + 0 2 CHH CTA U L L L L L
1 1020 + 0 2 CHH CCC U L L L L L
1 1021 + 0 2 CHH CCT U L L L L L
1 1022 + 0 2 CHH CTA U L L L L L
1 1027 + 0 2 CHH CCC U L L L L L
1 1028 + 0 2 CHH CCT U L L L L L
1 1029 + 1 2 CHH CTA U L L L L U
如果相邻两行第二列的数字不连续,则在这两行之间添加行,添加的行数等于两列数字的差,得到的结果文件:
1 1006 + 0 2 CHH CCC U L L L L L
1 1007 + 0 2 CHH CCT U L L L L L
1 1008 + 0 2 CHH CTA U L L L L L
   1009
   1010
   1011
   1012
1 1013 + 0 2 CHH CCC U L L L L L
1 1014 + 0 2 CHH CCT U L L L L L
1 1015 + 0 2 CHH CTA U L L L L L
   1016
   1017
   1018
   1019
1 1020 + 0 2 CHH CCC U L L L L L
1 1021 + 0 2 CHH CCT U L L L L L
1 1022 + 0 2 CHH CTA U L L L L L
   1023
   1024
   1025
   1026
1 1027 + 0 2 CHH CCC U L L L L L
1 1028 + 0 2 CHH CCT U L L L L L
1 1029 + 1 2 CHH CTA U L L L L U
作者: csccyab    时间: 2019-02-20 11:04
  1. $ awk 'NR>1{do {first=$1; gsub(/./," ",first); count++; if ($2!=count) print first" "count} while ($2>count)}  NR==1{count=$2; first=$1; gsub(/./, " ", first)} 1' a.txt
  2. 1 1006 + 0 2 CHH CCC U L L L L L
  3. 1 1007 + 0 2 CHH CCT U L L L L L
  4. 1 1008 + 0 2 CHH CTA U L L L L L
  5.   1009
  6.   1010
  7.   1011
  8.   1012
  9. 1 1013 + 0 2 CHH CCC U L L L L L
  10. 1 1014 + 0 2 CHH CCT U L L L L L
  11. 1 1015 + 0 2 CHH CTA U L L L L L
  12.   1016
  13.   1017
  14.   1018
  15.   1019
  16. 1 1020 + 0 2 CHH CCC U L L L L L
  17. 1 1021 + 0 2 CHH CCT U L L L L L
  18. 1 1022 + 0 2 CHH CTA U L L L L L
  19.   1023
  20.   1024
  21.   1025
  22.   1026
  23. 1 1027 + 0 2 CHH CCC U L L L L L
  24. 1 1028 + 0 2 CHH CCT U L L L L L
  25. 1 1029 + 1 2 CHH CTA U L L L L U
复制代码


作者: hechao7021    时间: 2019-02-20 11:32
回复 2# csccyab
非常感谢您的帮忙,太给力了
作者: hechao7021    时间: 2019-02-23 09:44
回复 2# csccyab

大神,请问如果第一列遇到不同的值,则从头开始插入要怎么做呢?我这样改输不出结果:awk 'NR>1{do {first[NR]=$1; gsub(/./," ",first); count++; if ($2!=count&&first[NR]==first[NR-1]) print first" "count} while ($2>count)}  NR==1{count=$2; first[NR]=$1; gsub(/./, " ", first)} 1' a.txta.txt
1 1006 + 0 2 CHH CCC U L L L L L
1 1007 + 0 2 CHH CCT U L L L L L
1 1008 + 0 2 CHH CTA U L L L L L
1 1013 + 0 2 CHH CCC U L L L L L
2 1005 + 0 2 CHH CCT U L L L L L
2 1009 + 0 2 CHH CTA U L L L L L
2 1010 + 0 2 CHH CCC U L L L L L
2 1012 + 0 2 CHH CCT U L L L L L
3 1002 + 0 2 CHH CTA U L L L L L
3 1017 + 0 2 CHH CCC U L L L L L
3 1018 + 0 2 CHH CCT U L L L L L
3 1020 + 1 2 CHH CTA U L L L L U
变成:
1 1006 + 0 2 CHH CCC U L L L L L
1 1007 + 0 2 CHH CCT U L L L L L
1 1008 + 0 2 CHH CTA U L L L L L
   1009
   1010
   1011
   1012
1 1013 + 0 2 CHH CCC U L L L L L
2 1005 + 0 2 CHH CCT U L L L L L
   1006
   1007
   1008
2 1009 + 0 2 CHH CTA U L L L L L
2 1010 + 0 2 CHH CCC U L L L L L
   1011
2 1012 + 0 2 CHH CCT U L L L L L
3 1017 + 0 2 CHH CCC U L L L L L
3 1018 + 0 2 CHH CCT U L L L L L
   1019
3 1020 + 1 2 CHH CTA U L L L L U

作者: wh7211    时间: 2019-02-23 12:50
本帖最后由 wh7211 于 2019-02-23 12:54 编辑

回复 1# hechao7021

  1. cat 1
  2. 1 1006 + 0 2 CHH CCC U L L L L L
  3. 1 1007 + 0 2 CHH CCT U L L L L L
  4. 1 1008 + 0 2 CHH CTA U L L L L L
  5. 1 1013 + 0 2 CHH CCC U L L L L L
  6. 1 1014 + 0 2 CHH CCT U L L L L L
  7. 1 1015 + 0 2 CHH CTA U L L L L L
  8. 1 1020 + 0 2 CHH CCC U L L L L L
  9. 1 1021 + 0 2 CHH CCT U L L L L L
  10. 1 1022 + 0 2 CHH CTA U L L L L L
  11. 1 1027 + 0 2 CHH CCC U L L L L L
  12. 1 1028 + 0 2 CHH CCT U L L L L L
  13. 1 1029 + 1 2 CHH CTA U L L L L U

  14. awk '{b=a?$2-a:1;if(b>1){for(i=1;i<b;i++){printf("  %d\n",++a)}};a=$2}1' 1
  15. 1 1006 + 0 2 CHH CCC U L L L L L
  16. 1 1007 + 0 2 CHH CCT U L L L L L
  17. 1 1008 + 0 2 CHH CTA U L L L L L
  18.   1009
  19.   1010
  20.   1011
  21.   1012
  22. 1 1013 + 0 2 CHH CCC U L L L L L
  23. 1 1014 + 0 2 CHH CCT U L L L L L
  24. 1 1015 + 0 2 CHH CTA U L L L L L
  25.   1016
  26.   1017
  27.   1018
  28.   1019
  29. 1 1020 + 0 2 CHH CCC U L L L L L
  30. 1 1021 + 0 2 CHH CCT U L L L L L
  31. 1 1022 + 0 2 CHH CTA U L L L L L
  32.   1023
  33.   1024
  34.   1025
  35.   1026
  36. 1 1027 + 0 2 CHH CCC U L L L L L
  37. 1 1028 + 0 2 CHH CCT U L L L L L
  38. 1 1029 + 1 2 CHH CTA U L L L L U
复制代码

作者: wh7211    时间: 2019-02-23 14:20
本帖最后由 wh7211 于 2019-02-23 14:21 编辑

回复 4# hechao7021

  1. cat 1
  2. 1 1006 + 0 2 CHH CCC U L L L L L
  3. 1 1007 + 0 2 CHH CCT U L L L L L
  4. 1 1008 + 0 2 CHH CTA U L L L L L
  5. 1 1013 + 0 2 CHH CCC U L L L L L
  6. 2 1005 + 0 2 CHH CCT U L L L L L
  7. 2 1009 + 0 2 CHH CTA U L L L L L
  8. 2 1010 + 0 2 CHH CCC U L L L L L
  9. 2 1012 + 0 2 CHH CCT U L L L L L
  10. 3 1002 + 0 2 CHH CTA U L L L L L
  11. 3 1017 + 0 2 CHH CCC U L L L L L
  12. 3 1018 + 0 2 CHH CCT U L L L L L
  13. 3 1020 + 1 2 CHH CTA U L L L L U

  14. awk '{b=a?$2-a:1;if(b>1){for(i=1;i<b;i++){printf("  %d\n",++a)}};a=$2}1' 1
  15. 1 1006 + 0 2 CHH CCC U L L L L L
  16. 1 1007 + 0 2 CHH CCT U L L L L L
  17. 1 1008 + 0 2 CHH CTA U L L L L L
  18.   1009
  19.   1010
  20.   1011
  21.   1012
  22. 1 1013 + 0 2 CHH CCC U L L L L L
  23. 2 1005 + 0 2 CHH CCT U L L L L L
  24.   1006
  25.   1007
  26.   1008
  27. 2 1009 + 0 2 CHH CTA U L L L L L
  28. 2 1010 + 0 2 CHH CCC U L L L L L
  29.   1011
  30. 2 1012 + 0 2 CHH CCT U L L L L L
  31. 3 1002 + 0 2 CHH CTA U L L L L L
  32.   1003
  33.   1004
  34.   1005
  35.   1006
  36.   1007
  37.   1008
  38.   1009
  39.   1010
  40.   1011
  41.   1012
  42.   1013
  43.   1014
  44.   1015
  45.   1016
  46. 3 1017 + 0 2 CHH CCC U L L L L L
  47. 3 1018 + 0 2 CHH CCT U L L L L L
  48.   1019
  49. 3 1020 + 1 2 CHH CTA U L L L L U
复制代码

作者: hechao7021    时间: 2019-02-23 14:43
回复 6# wh7211
万分感谢,受教了
作者: hechao7021    时间: 2019-03-02 09:54
awk '{b=a?$2-a:1;if(b>1&&$1==tep){for(i=1;i<b;i++){printf("  %d\n",++a)}};a=$2;tep=$1}1' 1




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