我有一个包含以下内容的文本文件 (FILE_A.txt):
Content1
Content2
Content3
和其他文本文件(FILE_B.txt)与此内容:
A[#]
B[#]
C[#]
我想以这种方式将FILE_A.txt和FILE_B.txt合并到其他文件(FILE_C.txt)中:
A[Content1]
B[Content2]
C[Content3]
我如何在linux中使用bash shell(sed,cut,grep等)来做到这一点?
我们开始了。
# awk 'NR==FNR{a[NR]=$0;next;} sub(/#/,a[FNR])' FILE_A.txt FILE_B.txt
A[Content1]
B[Content2]
C[Content3]
这是如何工作的?
- 与 FILE 记录号匹配,则运行以下语句 - 也就是说,我们当前仅读取 firs tfile。
-
{a[NR]=$0;next;}
- 将第一个文件中的值存储在数组中。 -
sub(/#/,a[FNR])
- 进入第二个文件后,用#
替换从第一个文件存储的匹配值。 请注意,这不在大括号内,因此它被评估为一个条件。 如果sub()
语句成功,则打印当前行。
NR==FNR
- 如果记录号按如下方式使用 paste
和sed
:
$ paste File_B.txt File_A.txt | sed 's/#]s*(.*$)/1]/g'
A[Content1]
B[Content2]
C[Content3]
下面同时读取两个文件,一次读取一行,并将行存储在 $value
和 $template
中。然后我们使用 bash 的变量子字符串替换将 $template
中的#
替换为 $value
的内容。
exec 6<"FILE_B.txt" # open file for reading and assign file descriptor 6
while read -r value; do # loop through FILE_A.txt, storing each line as $value
read -r template <&6 # read a line from FILE_B.txt, store as $template
echo ${template/#/$value} # replace value into the template in place of `#`
done <"FILE_A.txt"
exec 6<&- # close input file descriptor 6