2012-12-11 61 views
2

我有一个文本文件(FILE_A.txt)与此内容两个文本文件:结合在bash脚本

Content1 
Content2 
Content3 

和其他文本文件(FILE_B.txt)与此内容:

A[#] 
B[#] 
C[#] 

我想FILE_A.txt和FILE_B.txt在其他文件(FILE_C.txt)以这种方式结合:

A[Content1] 
B[Content2] 
C[Content3] 

我怎么能做出这样使用的bash shell在Linux中(sed,cut,grep等)?

+0

我再次尝试使用FILE_A和FILE_B的不同内容,但我不知道为什么它不起作用。 File_B.txt现在有“东西(#,@);”和File_A.txt有“__OtherTexts”。当我尝试将这两个文件与dogbane方法结合使用时,它会将每行的内容复制到FILE_B.txt中包含的行尾。有任何想法吗? –

+0

随着我的新问题,ghoti方法适用于我:) –

回答

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 - 导致如果记录数相匹配的文件记录号下运行下面的语句 - 也就是说,我们目前只读取冷杉tfile。
  • {a[NR]=$0;next;} - 将第一个文件的值存储在数组中。
  • sub(/#/,a[FNR]) - 一旦我们在第二个文件中,用#代替第一个文件存储的匹配值。请注意,这不在大括号内,因此它被评估为条件。如果sub()声明成功,则打印当前行。
+0

我试过你的方法,也有效。谢谢 –

+0

没问题,塞萨尔。这样做的好处还在于,因为我们使用'sub()'来替换一个子字符串,所以这个解决方案基本上把'FILE_A.txt'的行变成了'FILE_B.txt'中的数据模板。如果你的需求变得比你的样本数据更复杂,这可能比处理'paste'输出更好。 – ghoti

2

使用pastesed如下:

$ paste File_B.txt File_A.txt | sed 's/#]\s*\(.*$\)/\1]/g' 
A[Content1] 
B[Content2] 
C[Content3] 
+0

它的工作原理!并且非常简单和实用。 –

+0

适用于Linux,但'\ s'使它不可移植。除非你安装了GNU sed,否则不能在BSD,OSX,Solaris等中使用。 – ghoti

+0

@ghoti这很容易修复。您可以更改'paste'命令以使用您选择的特定分隔符(使用“-d”选项),然后在'sed'命令中使用相同的分隔符而不是'\ s *'。 – dogbane

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 
+0

** + 1 **。尼斯。 :) – ghoti

+0

复杂但很有教育意义。感谢您的回答。 –

+0

不客气Cesar。 –