删除带有非数字数据的行,并在linux中的特定文本格式之前插入文本

时间:2015-02-10 12:27:13

标签: linux awk sed grep

我有一个包含数千行格式的文件

unwantedtext1 
unwantedtext1
  50779       1   52476   52475   52481   52485
  50780       1   52485   52481   52480   52484
  .....
  .....
  unwantedText2
  50614  1.8837812e+001  7.0057003e+000  1.6900000e+002
  52200  4.6960466e+001 -2.5497744e+000  1.4950614e+002
  .....
  .....
unwantedtext3
unwantedtext3

为了实现我的目标,我尝试了

sed -n '/^[0-9]\{3\}/p'   input.txt and also   # to remove the line with non numeric in beginning
grep '^[0-9][0-9][0-9]' input.txt  > output.txt

在下一步中,当字段2变为实数而不是整数时,我必须在文件的开头添加文本wantedText1和wantedText2。所以输出将是

wantedtext1 
wantedtext1
  50779       1   52476   52475   52481   52485
  50780       1   52485   52481   52480   52484
  .....
  .....
  wantedText2
  50614  1.8837812e+001  7.0057003e+000  1.6900000e+002
  52200  4.6960466e+001 -2.5497744e+000  1.4950614e+002
  .....
  .....
wantedtext3
wantedtext3

这些想要的文本可以直接回显,也可以从其他文本输入。数据以空格分隔,而不是制表符分隔。

使用sed或awk的任何建议?

1 个答案:

答案 0 :(得分:1)

posix版本(GNU sed上的--posix

sed '#n
1 {x;s/.*/WantedText2/;x
   a\
WantedText1
   }
/^[[:blank:]]*[0-9]\{3,\}/ {
   /^[[:blank:]]*[0-9]\{3,\}[[:blank:]]\{1,\}[-0-9]\{1,\}\./ !p
   /^[[:blank:]]*[0-9]\{3,\}[[:blank:]]\{1,\}[-0-9]\{1,\}\./ H
   }
$ {x;p
   a\
Wanted\
Text\
3
   }' YourFile

选择并以1 sed

打印
  • 仅在p操作
  • 上设置打印
  • 在保留缓冲区中预加载WantedText2
  • 打印WantedText1
  • 从数字开始在线
    • 如果整数(不浮动)为第二个数字,则将其打印
    • 如果作为第二个号码浮动,则附加到hodling缓冲区
  • 如果到达终点,则加载保持缓冲区并打印并添加想要的文本3
  • 周期