Awk 是否有方法匹配文件中的字符串,并在字符串匹配后在下一行打印/追加另一个文件(单行)的内容

Awk 是否有方法匹配文件中的字符串,并在字符串匹配后在下一行打印/追加另一个文件(单行)的内容,awk,Awk,我正在尝试匹配文件中的字符串,并在字符串匹配后打印/附加另一个文件的内容 我有一个文件“addthis”,其中包含一行pleseADDME: pleaseaddme 我有第二个文件“tothis”,包含两行[1]和[2],如下所示: [one] [two] 我尝试过以下组合,结果接近我的预期结果: awk '/\[one\]/ { printf $0; getline < "addthis" }1' tothis 我希望在[一]之后的新行中添加“请添加我” 像这样: 此外,这只是在

我正在尝试匹配文件中的字符串,并在字符串匹配后打印/附加另一个文件的内容

我有一个文件“addthis”,其中包含一行
pleseADDME

pleaseaddme
我有第二个文件“tothis”,包含两行[1]和[2],如下所示:

[one]

[two]
我尝试过以下组合,结果接近我的预期结果:

awk '/\[one\]/ { printf $0; getline < "addthis" }1' tothis
我希望在[一]之后的新行中添加“请添加我” 像这样:

此外,这只是在屏幕上打印,而不是在文件“tothis”中打印

我尽可能地尝试了许多变化

awk '/\[one\]/ {getline var< "addthis"; $0 = $0 ORS var }1' tothis
#=> [one]
#=> pleaseaddme
#=> [two]
根据您自己的尝试,将
printf
实际更改为
print
将起作用:

awk '/\[one\]/ { print $0; getline < "addthis" }1' tothis
#=> [one]
#=> pleaseaddme
#=> [two]
awk'/\[one\]/{print$0;getline<“addthis”}1'到此
#=>[一]
#=>请注意
#=>[2]
因为
printf
不会打印
ORS
,但
print
会打印。
但是,在这种情况下,
$0
是多余的,因为默认情况下,不带参数的打印将打印
$0

至于就地更改,您仍然可以重定向到临时文件,稍后替换该文件

根据您自己的尝试,将
printf
实际更改为
print
将起作用:

awk '/\[one\]/ { print $0; getline < "addthis" }1' tothis
#=> [one]
#=> pleaseaddme
#=> [two]
awk'/\[one\]/{print$0;getline<“addthis”}1'到此
#=>[一]
#=>请注意
#=>[2]
因为
printf
不会打印
ORS
,但
print
会打印。
但是,在这种情况下,
$0
是多余的,因为默认情况下,不带参数的打印将打印
$0

至于就地更改,您仍然可以重定向到临时文件并在以后替换该文件。

您可以尝试使用:

>> awk '/\[one\]/ {getline s < "addthis"; $0=$0 "\n" s;} /[^\s]+/{print}' tothis
[one]
pleaseaddme
[two]
如果无法使用
-i inplace
,则应通过以下方法实现:

>> awk '/\[one\]/ {getline s < "addthis"; $0=$0 "\n" s;} /[^\s]+/{print}' tothis > fckmack && mv fckmack tothis
>awk'/\[one\]/{getline s<“addthis”;$0=$0“\n”s;}/[^\s]+/{print}'tothis>fckmack&&mv fckmack tothis
您可以尝试:

>> awk '/\[one\]/ {getline s < "addthis"; $0=$0 "\n" s;} /[^\s]+/{print}' tothis
[one]
pleaseaddme
[two]
如果无法使用
-i inplace
,则应通过以下方法实现:

>> awk '/\[one\]/ {getline s < "addthis"; $0=$0 "\n" s;} /[^\s]+/{print}' tothis > fckmack && mv fckmack tothis
>awk'/\[one\]/{getline s<“addthis”;$0=$0“\n”s;}/[^\s]+/{print}'tothis>fckmack&&mv fckmack tothis

考虑到我在mac上的awk版本,这是可行的

awk'/[one]/{getline s<“addthis”;$0=$0“\n”s;}/[^\s]+/{print}'tothis>fckmack&&mv fckmack tothis


鉴于我在mac上的awk版本,这是可行的

awk'/[one]/{getline s<“addthis”;$0=$0“\n”s;}/[^\s]+/{print}'tothis>fckmack&&mv fckmack tothis


我尝试了同样的方法,但是我得到了这个输出,第一个命令:
[one]pleseADDME[two]
,(两个
换行
pleseADDME
之后)第一个命令:
awk'/\[one\]/{getline varGNU awk,Linux认为这可能是一个问题——在macos 10.14上进行测试似乎不是问题option@FcknGioconda你能检查一下awk版本的输出吗?另外,请检查
添加此
到此
文件的内容。在OP的问题中,在
[one]
之后实际上有两个
换行符。我尝试了同样的方法,但我得到了这个输出,第一个命令是:
[one]pleaseddme[two]
,(两个
换行符
pleaseddme
之后)第一个:
awk'/\[one\]/{getline var
GNU awk,Linux认为这可能是一个问题——在macos 10.14上进行测试似乎不是问题option@FcknGioconda你能检查一下awk版本的输出吗?另外,请检查
添加此
到此
文件的内容。在OP的问题中,在
[one]
>>awk'/[one]/{getline s<“addthis”;$0=$0“\n”s;}/[^\s]+/{print}之后实际上有两个
换行符
,以获取正确的输出,但不将其保存到“tothis”文件中,并使用-i inplace i get error awk:unknown选项-我忽略了awk:cannot open file/[one]/{getline s<“addthis”$0=$0“\n”s;}/[^\s]+/{print}源行号1Yep,第二个是。我将它们分开。@whyfoo你在使用GNU awk?在mac awk版本上测试的是awk版本20070501>>awk'/[one]/{getline s<“addthis”$0=$0“\n”s;}/[^\s]+/{print}到这个…按需要工作,但不保存到文件>>awk'/[one]/{getline s<”addthis“;$0=$0”\n“s;}/[^\s]+/{print}”tothis获得正确的输出,但没有使用-i inplace i get error awk:unknown选项将其保存到“tothis”文件中-我忽略了awk:无法打开文件/[one]/{getline s<“addthis”;$0=$0“\n”s;}/[^\s]+/{print}源行号1Yep,第二个是。我把它们分开。@whyfoo你在使用GNU awk吗?在mac awk版本上测试的是awk版本20070501>>awk'/[one]/{getline s<“addthis”;$0=$0“\n”s;}/[^\s]+/{print}这个…可以按需要工作,但不能保存到文件中
>> awk '/\[one\]/ {getline s < "addthis"; $0=$0 "\n" s;} /[^\s]+/{print}' tothis > fckmack && mv fckmack tothis