bash如何根据另一个文件向一个文件插入多个空行

bash如何根据另一个文件向一个文件插入多个空行

当使用 bash 根据索引文件(称为 file2)将多个空行插入到文件(称为 file1)中时,我遇到了一些困难。 (这些文件可以被视为传递的变量)索引文件(file2)如下所示:

-
-
-
M
H
A
-
N
X
X
M
-
-
-
F
G
A
...

file1 看起来像这样:

M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0
...

输出应该是这样的:

-
-
-
M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
-
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
-
-
-
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0
...

如果file2删除'-',则内容和顺序将始终与file1中的第一列相同。

我尝试用Python中的dataframe来处理它,但它太慢了。所以我想知道如何使用 bash 来解决这个问题。谢谢!

答案1

假设索引文件中的字母始终是正确顺序的正确字母(因此我们可以忽略我们看到的字母),并且空行实际上包含破折号并且不是完全空的,也许这应该有效:

$ awk -v datafile=data.txt '$1 == "-" { print "-"; next} { getline < datafile; print }' < index.txt 
-
-
-
M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
-
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
-
-
-
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0
...

它一次读取一行索引文件;如果第一个字段正好是-,则打印该内容;否则从另一个文件读取并打印一行。 (这意味着如果索引文件中出现完全空的行,它也会转到数据文件中的下一行。)

答案2

使用 GNU sed,还假设两个文件中的首字母顺序严格相同,忽略这些行,为每个“字母”行-读取并插入一行:file1file2

$ sed -e '/^[A-Z]/{R file1' -e 'd;}' file2
-
-
-
M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
-
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
-
-
-
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0

答案3

以 file2 为索引文件,file1 为数据文件,使用POSIX sed,使用索引文件,我们首先生成一个 sed 代码,然后将其应用于数据文件以获得最终所需的输出。

sed '
  1{
    x;s:.*:H;s/.*/-/;x:;x
    i\
x;s/.*/-/;x
    :loop
      /^-/!d;g;n
    b loop
  }
  /^-/s/.*/G/;t
  c\
n
' file2 |sed -f - file1

输出:-

-
-
-
M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
-
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
-
-
-
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0

答案4

for j in $(awk '/-/{print NR}' file2); do sed -i ''$j'i -' file1; done

输出

cat file1
-
-
-
M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
-
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
-
-
-
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0

相关内容