这种帮助很有帮助,但我仍然有点迷失。我会窃取它的超级简单格式。 如何将一个文件的内容插入到另一个文件的模式(标记)之前?
我有两个文件。
文件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
我使用 subshell 来简单地管理文件描述符。 (不需要“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;
)