2

我有一个包含以下内容的文本文件(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 等)来实现这一点?

4

3 回答 3

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 记录号匹配,则导致运行以下语句 - 也就是说,我们当前仅读取第一个 tfile。
  • {a[NR]=$0;next;}- 将第一个文件中的值存储在数组中。
  • sub(/#/,a[FNR])- 一旦我们在第二个文件中,替换#从第一个文件中存储的匹配值。请注意,这不在大括号内,因此将其作为条件进行评估。如果sub()语句成功,则打印当前行。
于 2012-12-11T15:34:47.413 回答
2

使用pastesed如下:

$ paste File_B.txt File_A.txt | sed 's/#]\s*\(.*$\)/\1]/g'
A[Content1]
B[Content2]
C[Content3]
于 2012-12-11T15:32:11.700 回答
2

以下内容同时读取两个文件,一次一行,并将这些行存储在$valueand中$template。然后,我们使用 bash 的变量子字符串替换将#within替换$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
于 2012-12-11T15:42:57.870 回答