如何将数据从一行复制到Linux中接下来N行的结束列?

时间:2015-11-18 10:07:37

标签: python linux bash shell awk

请参阅下面的数据示例。我希望将Lat和Long添加到以下行的末尾,直到到达下一个lat和long,然后执行相同操作。这些lat和long值将通过文件更改。

当前数据

2010 02 15 19 29 2   0  LATITUDE:  37.19  LONGITUDE: 90.27  
2010 02 15 19 29 2   1  1316.1 304  18.2  -9.5  -6.6    
2010 02 15 19 29 2   2  1300.1 202   2.2   1.3  -1.2    
2010 02 15 19 29 2   3  1284.1 188   5.2   1.4  -0.4        
2010 02 15 19 49 2   0  LATITUDE:  37.19  LONGITUDE: 90.27   
2010 02 15 19 49 2   1  1316.1 277   9.5  -8.7  -8.4    
2010 02 15 19 49 2   2  1300.1 101   1.0  -1.4  -0.3    
2010 02 15 19 49 2   3  1284.1 195   2.8  -2.0   0.9    
2010 02 15 20 14 2   0  LATITUDE:  37.21  LONGITUDE: 90.27  
2010 02 15 20 14 2   1  1316.6 285   7.0  -1.2  -6.7    
2010 02 15 20 14 2   2  1300.6  46   2.8   2.1  -1.5    
2010 02 15 20 14 2   3  1284.6 194   6.2  -1.8  -0.4 

必填数据

2010 02 15 19 29 2   0  LATITUDE:  37.19  LONGITUDE: 90.27  
2010 02 15 19 29 2   1  1316.1 304  18.2  -9.5  -6.6 LATITUDE:  37.19  LONGITUDE: 90.27    
2010 02 15 19 29 2   2  1300.1 202   2.2   1.3  -1.2 LATITUDE:  37.19  LONGITUDE: 90.27    
2010 02 15 19 29 2   3  1284.1 188   5.2   1.4  -0.4 LATITUDE:  37.19  LONGITUDE: 90.27        
2010 02 15 19 49 2   0  LATITUDE:  37.19  LONGITUDE: 90.27   
2010 02 15 19 49 2   1  1316.1 277   9.5  -8.7  -8.4 LATITUDE:  37.19  LONGITUDE: 90.27    
2010 02 15 19 49 2   2  1300.1 101   1.0  -1.4  -0.3 LATITUDE:  37.19  LONGITUDE: 90.27    
2010 02 15 19 49 2   3  1284.1 195   2.8  -2.0   0.9 LATITUDE:  37.19  LONGITUDE: 90.27    
2010 02 15 20 14 2   0  LATITUDE:  37.21  LONGITUDE: 90.27  
2010 02 15 20 14 2   1  1316.6 285   7.0  -1.2  -6.7 LATITUDE:  37.21  LONGITUDE: 90.27    
2010 02 15 20 14 2   2  1300.6  46   2.8   2.1  -1.5 LATITUDE:  37.21  LONGITUDE: 90.27    
2010 02 15 20 14 2   3  1284.6 194   6.2  -1.8  -0.4 LATITUDE:  37.21  LONGITUDE: 90.27    

2 个答案:

答案 0 :(得分:2)

使用awk

awk '/LATITUDE/{v=""; for(i=8; i<=NF; i++)v=v" "$i; print; next} {print $0, v}' File

每当遇到模式LATITUDE时,将行的一部分(从LATITUDE到行尾)复制到变量v。对于包含LATITUDE的行,按原样打印行,对于其他行,打印行,然后打印以前保存的变量v

<强>输出

AMD$ awk '/LATITUDE/{v=""; for(i=8; i<=NF; i++)v=v" "$i; print; next} {print $0, v}' File


2010 02 15 19 29 2   0  LATITUDE:  37.19  LONGITUDE: 90.27
2010 02 15 19 29 2   1  1316.1 304  18.2  -9.5  -6.6      LATITUDE: 37.19 LONGITUDE: 90.27
2010 02 15 19 29 2   2  1300.1 202   2.2   1.3  -1.2      LATITUDE: 37.19 LONGITUDE: 90.27
2010 02 15 19 29 2   3  1284.1 188   5.2   1.4  -0.4          LATITUDE: 37.19 LONGITUDE: 90.27
2010 02 15 19 49 2   0  LATITUDE:  37.19  LONGITUDE: 90.27
2010 02 15 19 49 2   1  1316.1 277   9.5  -8.7  -8.4      LATITUDE: 37.19 LONGITUDE: 90.27
2010 02 15 19 49 2   2  1300.1 101   1.0  -1.4  -0.3      LATITUDE: 37.19 LONGITUDE: 90.27
2010 02 15 19 49 2   3  1284.1 195   2.8  -2.0   0.9      LATITUDE: 37.19 LONGITUDE: 90.27
2010 02 15 20 14 2   0  LATITUDE:  37.21  LONGITUDE: 90.27
2010 02 15 20 14 2   1  1316.6 285   7.0  -1.2  -6.7      LATITUDE: 37.21 LONGITUDE: 90.27
2010 02 15 20 14 2   2  1300.6  46   2.8   2.1  -1.5      LATITUDE: 37.21 LONGITUDE: 90.27
2010 02 15 20 14 2   3  1284.6 194   6.2  -1.8  -0.4   LATITUDE: 37.21 LONGITUDE: 90.27

答案 1 :(得分:0)

import sys
import re

f1 = open('20151118b.dat', 'r')
lat = ""
while True:
    line = f1.readline()
    if len(line) == 0: break
    line = line.rstrip()
    match = re.search('(LATITUDE:.*)$', line)
    if match:
        # save the LATITUDE, and use it later
        lat = match.group(1)
        print('{}'.format(line))
        continue
    print('{} {}'.format(line, lat))