cat file.txt
TEXT1 TEST2 TEST3
cat other_file.txt
there are multiple lines1.
there are multiple lines2.
there are multiple lines3
私は次のような出力が欲しい。
cat file3.txt
there are TEXT1 TEST2 TEST3 lines1
there are TEXT1 TEST2 TEST3 lines2
there are TEXT1 TEST2 TEST3 lines3
multiple
キーワードを各行のファイル内のすべての内容に置き換えます。これが明確になることを願っています。
答え1
テストされていません:
sed '1h;1d;G;s/multiple\(.*\)\n\(.*\)/\2\1/;P;d' file.txt other_file.txt > file3.txt
私は説明する必要がありますか?
答え2
を使用すると、以下のGNU Awk 5.1.0
コードが説明する内容を生成します。
cat file1
TEXT1 TEST2 TEST3
cat file2
there are multiple lines1.
there are multiple lines2.
there are multiple lines3.
awk 'NR==FNR{a=$0;next}{$3=a}1' file1 file2
there are TEXT1 TEST2 TEST3 lines1.
there are TEXT1 TEST2 TEST3 lines2.
there are TEXT1 TEST2 TEST3 lines3.
簡単な説明::
NR==FNR
awk NR(グローバルレコード数)をFNR(処理されたファイルのレコード数)と比較する簡単な方法です。最初のファイルの場合のみ、NRはFNRと同じです。
a=$0
:$0
レコード/行全体を保存し、という変数に保存します。a
next
:awk
ファイルの次のレコード/行を読み取ることを示します。
したがって、コードのこの部分は、awkへの最初のファイル入力であるfile1に対してのみ実行されます。
NR==FNR{a=$0;next}
PS:最初のファイルに複数の行がある場合、変数はa
file1の最後のレコード/行の内容を保持します。
このコードは2番目のファイル(file2)で実行されます。
{$3=a}1
$3=a
:($3
入力の3番目のフィールド)を変数の内容に置き換えますa
。明らかに、この解決策は、単語が常にfile2入力行の3番目のフィールドにない場合はmultiple
失敗します。
あるいは、同様の方法を使用して、literalという単語を変数の内容に{sub("multiple",a)}1
置き換えることもできます。multiple
a
1
:現在のレコード/ラインのみ印刷