插入文件的内容作为文件的第一行;在bash(GNU)

时间:2017-11-17 23:29:02

标签: bash sed kml

具体任务是使用KML文件的标题并将其插入到数百个没有标题的拆分KML数据文件中。

KML标题是多行和特定间距。我发现我可以使用带有“r”readfile选项的Sed来获取包含标题的文件的内容。但是,当我使用'1r'插入数据时,标题将放在从第二行开始的文件中。 sed似乎没有让我在前面插入“第0行”。插入模式可以工作,但我不能只抓取保存在文件中的标题格式,并且需要编写整个标题的脚本。

#!/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>

然而,这是我目前最好的命令让我:

<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>

2 个答案:

答案 0 :(得分:1)

我建议尝试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/*

工作原理:

  • -i inplace

    这告诉awk就地更改文件。

  • FNR==NR{hdr=hdr "\n" $0; next}

    这告诉awk,当读取第一个文件(标题)时,它应该将内容保存在变量hdr中,跳过其余的命令,然后跳转到next行。 / p>

  • FNR==1{print substr(hdr,2)}

    这说明,当它启动一个新文件时,它应首先打印标题(减去变量hdr中不需要的初始换行符。)

  • 1

    这是打印当前行的神秘简写。

实施例

$ cat >header
1  
2
3
$ cat >file1
4
5
6
$ cat >file2
44
55
66

使用我们的命令就地更改文件:

$ 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

帽子提示Barmar

答案 1 :(得分:1)

您可以使用cat file1 file2 > newfilefile1添加到file2。这样做是循环的。

for i in Split/*
do
    cat KML_Header.txt "$i" > "$i.new" && mv "$i.new" "$i"
done