插入文件内容作为文件的第一行;在bash中(GNU)
具体任务是使用KML文件的头,并将其插入到数百个没有头的分割KML数据文件中 KML标题为多行和特定间距。我发现我可以使用Sed和'r'readfile选项来获取包含头的文件的内容。但是,当我插入带有“1r”的数据时,头被放在从第二行开始的文件中。sed似乎不允许我在之前插入地址“第0行”。插入模式可以工作,但我不能只获取保存在文件中的头格式,需要编写整个头的脚本插入文件内容作为文件的第一行;在bash中(GNU),bash,sed,kml,Bash,Sed,Kml,具体任务是使用KML文件的头,并将其插入到数百个没有头的分割KML数据文件中 KML标题为多行和特定间距。我发现我可以使用Sed和'r'readfile选项来获取包含头的文件的内容。但是,当我插入带有“1r”的数据时,头被放在从第二行开始的文件中。sed似乎不允许我在之前插入地址“第0行”。插入模式可以工作,但我不能只获取保存在文件中的头格式,需要编写整个头的脚本 #!/bin/bash for i in ./Split/*; do sed -i '1r KML_Header.t
#!/bin/bash
for i in ./Split/*;
do sed -i '1r KML_Header.txt' $i
done
KML标题如下所示:
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'xmlns:gx='http://www.google.com/kml/ext/2.2'>
<Document>
<Placemark>
<open>1</open>
<gx:Track>
<altitudeMode>clampToGround</altitudeMode>
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'xmlns:gx='http://www.google.com/kml/ext/2.2'>
<Document>
<Placemark>
<open>1</open>
<gx:Track>
<altitudeMode>clampToGround</altitudeMode>
<when>2017-11-16T11:47:52Z</when>
<gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
<when>2017-11-16T11:47:44Z</when>
<gx:coord>-97.8216137 30.481513600000003 259</gx:coord>
<when>2017-11-16T11:45:37Z</when>
<gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
<when>2017-11-16T11:44:54Z</when>
<gx:coord>-97.82162970000002 30.481479699999998 261</gx:coord>
<when>2017-11-16T11:39:55Z</when>
1.
攀爬地面
标题的最终结果如下所示:
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'xmlns:gx='http://www.google.com/kml/ext/2.2'>
<Document>
<Placemark>
<open>1</open>
<gx:Track>
<altitudeMode>clampToGround</altitudeMode>
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'xmlns:gx='http://www.google.com/kml/ext/2.2'>
<Document>
<Placemark>
<open>1</open>
<gx:Track>
<altitudeMode>clampToGround</altitudeMode>
<when>2017-11-16T11:47:52Z</when>
<gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
<when>2017-11-16T11:47:44Z</when>
<gx:coord>-97.8216137 30.481513600000003 259</gx:coord>
<when>2017-11-16T11:45:37Z</when>
<gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
<when>2017-11-16T11:44:54Z</when>
<gx:coord>-97.82162970000002 30.481479699999998 261</gx:coord>
<when>2017-11-16T11:39:55Z</when>
1.
攀爬地面
2017-11-16T11:47:52Z
-97.8216659 30.481537499999998 261
2017-11-16T11:47:44Z
-97.8216137 30.481513600000003 259
2017-11-16T11:45:37Z
-97.8216659 30.481537499999998 261
2017-11-16T11:44:54Z
-97.82162970000002 30.481479699999998 261
2017-11-16T11:39:55Z
然而,这是我目前最好的命令:
<when>2017-11-16T11:47:52Z</when>
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'xmlns:gx='http://www.google.com/kml/ext/2.2'>
<Document>
<Placemark>
<open>1</open>
<gx:Track>
<altitudeMode>clampToGround</altitudeMode>
<gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
<when>2017-11-16T11:47:44Z</when>
<gx:coord>-97.8216137 30.481513600000003 259</gx:coord>
<when>2017-11-16T11:45:37Z</when>
<gx:coord>-97.8216659 30.481537499999998 261</gx:coord>
<when>2017-11-16T11:44:54Z</when>
<gx:coord>-97.82162970000002 30.481479699999998 261</gx:coord>
<when>2017-11-16T11:39:55Z</when>
2017-11-16T11:47:52Z
1.
攀爬地面
-97.8216659 30.481537499999998 261
2017-11-16T11:47:44Z
-97.8216137 30.481513600000003 259
2017-11-16T11:45:37Z
-97.8216659 30.481537499999998 261
2017-11-16T11:44:54Z
-97.82162970000002 30.481479699999998 261
2017-11-16T11:39:55Z
我建议试试awk。使用GNU awk:
awk -i inplace 'FNR==NR{hdr=hdr "\n" $0; next} FNR==1{print substr(hdr,2)} 1' inplace=0 header inplace=1 ./Split/*
工作原理:
这会告诉awk在适当的位置更改文件-i就地
这告诉awk,当读取第一个文件(头)时,它应该将内容保存在变量FNR==NR{hdr=hdr“\n”$0;next}
中,跳过其余命令,然后跳转到hdr
下一行
这说明,当它启动一个新文件时,它应该首先打印标题(减去变量FNR==1{print substr(hdr,2)}
中不需要的初始换行符)hdr
这是awks用于打印当前行的神秘速记1
$ awk -i inplace 'FNR==NR{hdr=hdr "\n" $0; next} FNR==1{print substr(hdr,2)} 1' inplace=0 header inplace=1 file*
$ cat file1
1
2
3
4
5
6
$ cat file2
1
2
3
44
55
66
帽子提示。我建议试试awk。使用GNU awk:
awk -i inplace 'FNR==NR{hdr=hdr "\n" $0; next} FNR==1{print substr(hdr,2)} 1' inplace=0 header inplace=1 ./Split/*
工作原理:
这会告诉awk在适当的位置更改文件-i就地
这告诉awk,当读取第一个文件(头)时,它应该将内容保存在变量FNR==NR{hdr=hdr“\n”$0;next}
中,跳过其余命令,然后跳转到hdr
下一行
这说明,当它启动一个新文件时,它应该首先打印标题(减去变量FNR==1{print substr(hdr,2)}
中不需要的初始换行符)hdr
这是awks用于打印当前行的神秘速记1
$ awk -i inplace 'FNR==NR{hdr=hdr "\n" $0; next} FNR==1{print substr(hdr,2)} 1' inplace=0 header inplace=1 file*
$ cat file1
1
2
3
4
5
6
$ cat file2
1
2
3
44
55
66
帽子提示。您可以使用
cat file1 file2>newfile
将file1
前置到file2
。以循环方式执行此操作
for i in Split/*
do
cat KML_Header.txt "$i" > "$i.new" && mv "$i.new" "$i"
done
您可以使用
cat file1 file2>newfile
将file1
前置到file2
。以循环方式执行此操作
for i in Split/*
do
cat KML_Header.txt "$i" > "$i.new" && mv "$i.new" "$i"
done
有很多方法可以做到这一点,比如这里:或者有很多方法可以做到这一点,比如这里:或者有一种更好的方法不需要重写头文件。将
inplace=0
放在header
之前,将inplace=1
放在后面。有关在GNU awk中inplace如何工作的详细信息,请参阅。@Barmar更好。谢谢谢谢@John1024,我能让这个工作。我也非常感谢对这些片段的详细解释。我一直对学习awk和sed这两种看似无穷无尽的选择感兴趣。不过我更喜欢Barmar提供的更简单的方法。有一种更好的方法不需要重写头文件。将inplace=0
放在header
之前,将inplace=1
放在后面。有关在GNU awk中inplace如何工作的详细信息,请参阅。@Barmar更好。谢谢谢谢@John1024,我能让这个工作。我也非常感谢对这些片段的详细解释。我一直对学习awk和sed这两种看似无穷无尽的选择感兴趣。不过我更喜欢Barmar提供的更简单的方法。感谢@Barmar提供的快速响应和简单解决方案!感谢@barmar的快速响应和简单解决方案!