我有一个包含以下内容的文本文件(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等)?
答案 0 :(得分:3)
我们走了。
# awk 'NR==FNR{a[NR]=$0;next;} sub(/#/,a[FNR])' FILE_A.txt FILE_B.txt
A[Content1]
B[Content2]
C[Content3]
这是如何运作的?
NR==FNR
- 如果记录号与FILE记录号匹配,则会运行以下语句 - 也就是说,我们当前只读取第一个文件。{a[NR]=$0;next;}
- 将第一个文件中的值存储在数组中。sub(/#/,a[FNR])
- 一旦我们进入第二个文件,请用#
替换第一个文件中存储的匹配值。请注意,这不在花括号内,因此它被评估为条件。如果sub()
语句成功,则打印当前行。答案 1 :(得分:2)
使用paste
和sed
,如下所示:
$ paste File_B.txt File_A.txt | sed 's/#]\s*\(.*$\)/\1]/g'
A[Content1]
B[Content2]
C[Content3]
答案 2 :(得分:2)
以下同时读取两个文件,一次读取一行,并将行存储在$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