如何从文件中读取行并在来自另一个文件的模式匹配之前进行组合?

如何从文件中读取行并在来自另一个文件的模式匹配之前进行组合?

这种帮助很有帮助,但我仍然有点迷失。我会窃取它的超级简单格式。 如何将一个文件的内容插入到另一个文件的模式(标记)之前?

我有两个文件。

文件1

test
test2
test3
test4

文件2

Numebr of results: 0
Numebr of results: 1

Object Name: 
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source 
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
Numebr of results: 0
Numebr of results: 0

期望的最终结果(文件 3?)

test
Numebr of results: 0
test2
Numebr of results: 1

Object Name: 
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source 
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
test3
Numebr of results: 0
test4
Numebr of results: 0

希望从 file1 中一次读取一行,找到“Numebr of results”的下一个模式,将 file1 中的 line1 插入到第一个匹配项上方,然后依次迭代整个文件。

提前非常感谢!

答案1

我建议使用获取行/变量/文件的形式awk getline

$ awk '/^Numebr of results/ {if (getline line < "file1" > 0) print line} 1' file2
test
Numebr of results: 0
test2
Numebr of results: 1

Object Name:
Object UID: {A42CD268-ommitted}
Class Name: referral
last_element: false
referral_info: source
referral_obj: Name: ommitted (Table: ommitted)
scheme_flags: 0
type: member
test3
Numebr of results: 0
test4
Numebr of results: 0

答案2

$ awk 'NR==FNR{A[NR]=$0;next}{if($0~/^Numebr of results/){i++;print A[i]}}1' file1 file2
test
Numebr of results: 0
test2
Numebr of results: 1

Object Name:
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
test3
Numebr of results: 0
test4
Numebr of results: 0

答案3

可以用 来完成sed,尽管awk会更合适:

回声“----” | cat 文件1 - 文件2 | sed -n '1,/----/{H;d}; /Numebr/ {x;s/^\n//;P;s/[^\n]*\n//;x;}; p'

答案4

我使用 subshel​​l 来简单地管理文件描述符。 (不需要“exec 3>&-”)
继承到子进程的文件描述符
如果您使用这样的文件描述符,则每次读取操作都会将文件位置移动到下面。
“e”选项将模式空格字符串作为 sh 中的命令执行

sh$ ( exec 3< file2; 

  sed -r '
    /^Number of results: [0-9]+/ {
    h
    s#.*#read line <\&3; echo -n "$line"#e
    G
    }
  ' file1; 
)

相关内容