请问用bash怎么做?

时间:2014-11-25 20:33:50

标签: bash awk sed

我有这个名为final.txt的文件,其中包含:

 Latitude                      36.8962 +-    0.0075 N         0.8348 km
 Latitude                      36.8962 +-    0.0075 N         0.8348 km
 Latitude                      36.8958 +-    0.0075 N         0.8351 km
 Longitude                     15.1930 +-    0.0097 E         0.8624 km
 Longitude                     15.1930 +-    0.0097 E         0.8624 km
 Longitude                     15.1917 +-    0.0097 E         0.8624 km
 Epoch Time             1340759658.852 +-      0.19 sec
 Depth                           10.00 +-      1.57 km
 Depth                           10.00 +-      1.57 km
 Depth                           10.00 +-      1.58 km
 Gap                               248              deg
 Gap                               248              deg
 Gap                               248              deg

问题:给定名为“final.txt”的文件编写脚本以提取纬度,经度,深度和间隙的值。此信息必须存储在一个文件中,其结构如下: 纬度,经度,深度,差距 (以逗号分隔的列)。

对于提取部分是可以的,这是:

sed -n /Latitude/p final.txt > data.txt
sed -n /Longitude/p final.txt >> data.txt
sed -n /Depth/p final.txt >> data.txt
sed -n /Gap/p final.txt >> data.txt

现在问题在于所需的结构。我想知道如何提取单词" Latitude"之后写的内容。对于3行中的每一行,将它们中的所有三行放在一列中,如下所示。

Latitude
 36.8962 +-    0.0075 N         0.8348 km
 36.8962 +-    0.0075 N         0.8348 km
 36.8958 +-    0.0075 N         0.8351 km

感谢任何帮助!提前致谢。

3 个答案:

答案 0 :(得分:1)

以下脚本将生成输出文件Depth.txt, Epoch.txt, file.txt, Gap.txt, Latitude.txt, Longitude.txt

#!/usr/bin/gawk -f

{
    for (i=2; i<=NF; i++) {
        array[$1][NR]= array[$1][NR] "  "  $i
    }
}

END {
    for (i in array) {
        print(i)  > i".txt"
        for (j in array[i]) {
            print(array[i][j]) > i".txt"
        }
    }
}

执行程序

$ cat file.txt |./process.awk

输出:

$ cat Latitude.txt 
Latitude
  36.8962  +-  0.0075  N  0.8348  km
  36.8962  +-  0.0075  N  0.8348  km
  36.8958  +-  0.0075  N  0.8351  km

$ cat Longitude.txt 
Longitude
  15.1930  +-  0.0097  E  0.8624  km
  15.1930  +-  0.0097  E  0.8624  km
  15.1917  +-  0.0097  E  0.8624  km

答案 1 :(得分:0)

使用,这是你期望的吗?

$ awk '{item=$1;$1="";arr[item]=arr[item]"\n"$0}END{for (a in arr) {print a, arr[a]}}' file
Depth 
 10.00 +- 1.57 km
 10.00 +- 1.57 km
 10.00 +- 1.58 km
Epoch 
 Time 1340759658.852 +- 0.19 sec
Gap 
 248 deg
 248 deg
 248 deg
Latitude 
 36.8962 +- 0.0075 N 0.8348 km
 36.8962 +- 0.0075 N 0.8348 km
 36.8958 +- 0.0075 N 0.8351 km
Longitude 
 15.1930 +- 0.0097 E 0.8624 km
 15.1930 +- 0.0097 E 0.8624 km
 15.1917 +- 0.0097 E 0.8624 km

答案 2 :(得分:0)

如果我理解正确,您需要以下输出:

36.8962 +- 0.0075 N 0.8348 km, 15.1930 +- 0.0097 E 0.8624 km, 10.00 +- 1.57 km, 248 deg
36.8962 +- 0.0075 N 0.8348 km, 15.1930 +- 0.0097 E 0.8624 km, 10.00 +- 1.57 km, 248 deg
36.8958 +- 0.0075 N 0.8351 km, 15.1917 +- 0.0097 E 0.8624 km, 10.00 +- 1.58 km, 248 deg

如果这是真的,我建议:

#!/usr/bin/gawk -f

/Latitude/    {$1=""; print > "Lat"}
/Longitude/   {$1=""; print > "Long"}
/Epoch Time/  {                     }
/Depth/       {$1=""; print > "Depth"}
/Gap/         {$1=""; print > "Gap"}


END { system ("paste -d , Lat Long Depth Gap")}