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 シェル (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])--2番目のファイルに移動したら#、最初のファイルから保存された一致する値に置き換えます。これは中括弧の内側ではないため、条件として評価されていることに注意してください。ステートメントが成功する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

次の例では、一度に 1 行ずつ両方のファイルを同時に読み取り、その行を と に格納し$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
于 2012-12-11T15:42:57.870 に答える