2011-08-04 139 views
1

作为学位课程的一部分,我必须使用输出大量数据点的软件。我遇到的问题是它输出它的方式,我不能绘制它(不是没有手动格式化它)。原始输出看起来是这样的:使用bash脚本格式化文件

kpt# 1, nband= 30, wtk= 1.00000, kpt= 0.0000 0.0000 0.0000 (reduced coord) 
    -3.34630 -3.17801 -3.09372 -3.02971 -3.02971 -2.99649 -2.99399 -2.92282 
    -2.83147 -2.83147 -1.71295 -1.43814 -1.43814 -1.35290 -0.76039 -0.68874 
    -0.63265 -0.62874 -0.62874 -0.41856 -0.19886 -0.19886 -0.18178 -0.08505 
    -0.01900 0.03106 0.03140 0.03140 0.04786 0.07255 
kpt# 2, nband= 30, wtk= 1.00000, kpt= 0.0101 0.0101 0.0000 (reduced coord) 
    -3.28432 -3.17790 -3.09155 -3.01881 -3.00521 -2.99279 -2.98718 -2.91048 
    -2.83086 -2.83038 -1.71286 -1.43814 -1.43810 -1.35288 -0.75994 -0.68868 
    -0.63260 -0.62875 -0.62873 -0.41848 -0.19909 -0.19886 -0.18140 -0.08502 
    -0.01886 0.02667 0.03126 0.03590 0.04781 0.07262 
. 
. 
. 
kpt# 3, nband= 30, wtk= 1.00000, kpt= 0.0202 0.0202 0.0000 (reduced coord) 
    -3.25059 -3.17763 -3.08747 -3.03929 -3.00146 -2.99159 -2.96062 -2.89743 
    -2.83133 -2.83014 -1.71274 -1.43817 -1.43810 -1.35287 -0.75943 -0.68865 
    -0.63250 -0.62885 -0.62877 -0.41829 -0.19976 -0.19888 -0.18036 -0.08499 
    -0.01851 0.02198 0.03084 0.04028 0.04753 0.07283 
kpt# 4, nband= 30, wtk= 1.00000, kpt= 0.0303 0.0303 0.0000 (reduced coord) 
    -3.25108 -3.17577 -3.08771 -3.04025 -3.00164 -2.98867 -2.96080 -2.89726 
    -2.83695 -2.83100 -1.71270 -1.43829 -1.43819 -1.35287 -0.75914 -0.68881 
    -0.63236 -0.62892 -0.62883 -0.41799 -0.20076 -0.19897 -0.17884 -0.08492 
    -0.01820 0.01707 0.03016 0.04442 0.04683 0.07314 

基本上,我需要一个bash脚本把数字的所有列表中的每一行之间开始“KPT#”在一行,删除线开始“KPT#”,并把每行开头的行号就像这样:

1 -3.34630 -3.17801 -3.09372 -3.02971 -3.02971 -2.99649 -2.99399 ... 
2 -3.28432 -3.17790 -3.09155 -3.01881 -3.00521 -2.99279 -2.98718 ... 
3 -3.25059 -3.17763 -3.08747 -3.03929 -3.00146 -2.99159 -2.96062 ... 

这将允许我马上绘制它!任何帮助大量赞赏。干杯 杰克中号

回答

1

如果AWK是可以接受的:

awk 'END { 
    print kpt, r 
    } 
/kpt#/ { 
    if (kpt) 
    print kpt, r 
    r = x 
    sub(/,.*/, x, $2) 
    kpt = $2 
    next 
    } 
{ 
    r = r ? r FS $0 : $0 
    }' infile 
2

假设你的数据在一个叫data.txt

grep -v 'kpt#' data.txt | nl -nln 

grep -v的删除标题行文件和nl -nln增加左合理的数字的线。

+0

聪明的一个!但OP需要与“kpt-line”匹配的数据在一行上,否则您的解决方案无法处理加入的部分... –

+0

好点。没有完全读完这个问题。这会更接近:'sed -e's/kpt#。*/;; /'data | tr'\ n'''| sed -e's/;;/\ n/g'| nl -nln' –

0

解决方案使用sed

sed 's/^kpt# *\([0-9]*\).*$/\1/' input | sed 'N;N;N;N;s/\n/ /g'