【问题标题】:How to combine two files by inserting lines at multiple different locations with awk/sed如何通过使用 awk/sed 在多个不同位置插入行来组合两个文件
【发布时间】:2019-11-01 08:03:26
【问题描述】:

我有两个文件:file1.txt 和 file2.txt。第一个,file1.txt,包含大量信息,并且不定期地显示单词 TIMESTEP。另一方面,第二个文件 file2.txt 仅包含一列整数值。我想解析 file1.txt,找到带有 TIMESTEP 的行,然后用 file2.txt 中的下一行替换 following 行。举个例子:

file1.txt

ITEM: TIMESTEP
54
abc
def
ghi
jkl
ITEM: TIMESTEP
55
horse
cat
dog
ITEM: TIMESTEP
56
tree
ITEM: TIMESTEP
57
house
school
...

file2.txt

150
68
201
202
...

将它们组合起来得到:

ITEM: TIMESTEP
150
abc
def
ghi
jkl
ITEM: TIMESTEP
68
horse
cat
dog
ITEM: TIMESTEP
201
tree
ITEM: TIMESTEP
202
house
school
...

谢谢!

【问题讨论】:

  • 看起来像awk 中的一个简短脚本。您可以在 tutorialspoint 找到 awk 教程。这样做,:传递给awk 两个文件。首先将file2.txt 加载到一个数组中。然后对于file1.txt 中的每一行,如果一行与/TIMESTEP/ 匹配,则打印该行,getline 下一行并打印数组中的一个数字。您将需要另一个数组中的索引 - 在打印数组中的数字后递增它。网上有很多 awk 教程,这是一种简单的语言,您很快就会学会!
  • 不,不要下一行,因为这容易出错、难以增强且不必要。见awk.freeshell.org/AllAboutGetline

标签: bash shell unix awk sed


【解决方案1】:

这可能对你有用(GNU sed):

sed -e '/TIMESTEP/{n;R file2' -e 'd}' file1

遇到包含TIMESTEP的行后打印然后获取下一行,从file2中读取/打印一行,然后从file1中删除当前行。

【讨论】:

    【解决方案2】:
    $ awk '
        NR==FNR { vals[NR]=$0; next }
        found { $0=vals[++cnt]; found=0 }
        /TIMESTEP/ { found=1 }
        { print }
    ' file2 file1
    ITEM: TIMESTEP
    150
    abc
    def
    ghi
    jkl
    ITEM: TIMESTEP
    68
    horse
    cat
    dog
    ITEM: TIMESTEP
    201
    tree
    ITEM: TIMESTEP
    202
    house
    school
    

    【讨论】:

    • 谢谢,埃德!这完美地工作。为了完整起见,在您的代码中,file2 是我的 file1.txt,而 file1 是我的 file2.txt——以防将来有人也寻找这个!
    • 不,我的 file1 是你的 file1.txt 等等。不客气。
    猜你喜欢
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2017-07-20
    相关资源
    最近更新 更多