插入文件的内容作为文件的第一行;在 bash (GNU)
Insert the contents of a file as the first lines of a file; In bash (GNU)
具体任务是利用一个KML文件的header并将其插入到数百个没有header.
的拆分KML数据文件中
KML header 是多行和特定间距。我发现我可以使用带有 'r' readfile 选项的 Sed 来获取包含 header 的文件的内容。但是,当我使用“1r”插入数据时,header 被放置在从第二行开始的文件中。 sed 似乎不允许我在地址 'line 0' 之前插入。插入模式可以工作,但我不能只获取保存在文件中的 header 格式,需要编写整个 header 的脚本。
#!/bin/bash
for i in ./Split/*;
do sed -i '1r KML_Header.txt' $i
done
KML Header 看起来像这样:
<?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>
header 的最终结果将如下所示:
<?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>
然而,这是我目前最好的命令让我得到的:
<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>
我建议试试 awk。使用 GNU awk:
awk -i inplace 'FNR==NR{hdr=hdr "\n" [=10=]; next} FNR==1{print substr(hdr,2)} 1' inplace=0 header inplace=1 ./Split/*
工作原理:
-i inplace
这告诉 awk 就地更改文件。
FNR==NR{hdr=hdr "\n" [=14=]; next}
这告诉 awk,当读取第一个文件(文件头)时,它应该将内容保存在变量 hdr
中,跳过其余命令,并跳转到 next
行.
FNR==1{print substr(hdr,2)}
这表明,当它开始一个新文件时,它应该首先打印文件头(减去变量 hdr
中不需要的初始换行符)。
1
这是用于打印当前行的 awks 神秘 shorthand。
例子
$ cat >header
1
2
3
$ cat >file1
4
5
6
$ cat >file2
44
55
66
使用我们的命令就地更改文件:
$ awk -i inplace 'FNR==NR{hdr=hdr "\n" [=12=]; 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
向 Barmar 致敬。
您可以使用 cat file1 file2 > newfile
将 file1
添加到 file2
之前。循环执行此操作。
for i in Split/*
do
cat KML_Header.txt "$i" > "$i.new" && mv "$i.new" "$i"
done
具体任务是利用一个KML文件的header并将其插入到数百个没有header.
的拆分KML数据文件中KML header 是多行和特定间距。我发现我可以使用带有 'r' readfile 选项的 Sed 来获取包含 header 的文件的内容。但是,当我使用“1r”插入数据时,header 被放置在从第二行开始的文件中。 sed 似乎不允许我在地址 'line 0' 之前插入。插入模式可以工作,但我不能只获取保存在文件中的 header 格式,需要编写整个 header 的脚本。
#!/bin/bash
for i in ./Split/*;
do sed -i '1r KML_Header.txt' $i
done
KML Header 看起来像这样:
<?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>
header 的最终结果将如下所示:
<?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>
然而,这是我目前最好的命令让我得到的:
<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>
我建议试试 awk。使用 GNU awk:
awk -i inplace 'FNR==NR{hdr=hdr "\n" [=10=]; next} FNR==1{print substr(hdr,2)} 1' inplace=0 header inplace=1 ./Split/*
工作原理:
-i inplace
这告诉 awk 就地更改文件。
FNR==NR{hdr=hdr "\n" [=14=]; next}
这告诉 awk,当读取第一个文件(文件头)时,它应该将内容保存在变量
hdr
中,跳过其余命令,并跳转到next
行.FNR==1{print substr(hdr,2)}
这表明,当它开始一个新文件时,它应该首先打印文件头(减去变量
hdr
中不需要的初始换行符)。1
这是用于打印当前行的 awks 神秘 shorthand。
例子
$ cat >header
1
2
3
$ cat >file1
4
5
6
$ cat >file2
44
55
66
使用我们的命令就地更改文件:
$ awk -i inplace 'FNR==NR{hdr=hdr "\n" [=12=]; 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
向 Barmar 致敬。
您可以使用 cat file1 file2 > newfile
将 file1
添加到 file2
之前。循环执行此操作。
for i in Split/*
do
cat KML_Header.txt "$i" > "$i.new" && mv "$i.new" "$i"
done