cat file.txt
TEXT1 TEST2 TEST3
cat other_file.txt
there are multiple lines1.
there are multiple lines2.
there are multiple lines3
我想要以下输出:
cat file3.txt
there are TEXT1 TEST2 TEST3 lines1
there are TEXT1 TEST2 TEST3 lines2
there are TEXT1 TEST2 TEST3 lines3
multiple
将关键字替换为每行文件中的所有内容希望这是清楚的
答案1
未经测试:
sed '1h;1d;G;s/multiple\(.*\)\n\(.*\)/\2\1/;P;d' file.txt other_file.txt > file3.txt
我需要解释吗?
答案2
使用GNU Awk 5.1.0
,下面的代码将产生您所描述的内容。
cat file1
TEXT1 TEST2 TEST3
cat file2
there are multiple lines1.
there are multiple lines2.
there are multiple lines3.
awk 'NR==FNR{a=$0;next}{$3=a}1' file1 file2
there are TEXT1 TEST2 TEST3 lines1.
there are TEXT1 TEST2 TEST3 lines2.
there are TEXT1 TEST2 TEST3 lines3.
简短说明:
NR==FNR
:awk 比较 NR(全局记录数)与 FNR(已处理文件的记录数)的快速方法。仅对于第一个文件,NR 等于 FNR。
a=$0
:$0
保存整个记录/行,并将其存储在名为的变量中a
next
:表示awk
读取文件的下一条记录/行。
因此,这部分代码仅针对输入到 awk 的第一个文件执行,即 file1:
NR==FNR{a=$0;next}
PS:如果您的第一个文件有多于一行,则变量a
将保存 file1 的最后一条记录/最后一行的内容。
这段代码在第二个文件(file2)上执行:
{$3=a}1
$3=a
:$3
用变量 的内容替换(输入的第三个字段)a
。如果该单词multiple
并不总是位于 file2 输入行的第三个字段上,则显然此解决方案将失败。
或者,您可以使用类似的方法{sub("multiple",a)}1
将单词字面替换multiple
为变量的内容a
。
1
: 只打印当前记录/行