Unixで最後の単語の後にファイルテキストを追加する

Unixで最後の単語の後にファイルテキストを追加する

UNIXシステムでは、他のファイルの最後の単語の後にファイルテキストを追加したいと思います。

ファイル1

& program executed successfully

ファイル2

Hello
World
This is a sample output 

最初の2つの単語をコピーしてfile2の最後の単語の後に貼り付けたいです。

予想出力:

ファイル3

Hello
World
This is a sample output & program

File2には末尾に改行文字があるので、それを使用しようとすると、cat同じ行の最後の単語の後にではなく新しい行に印刷されます。 UNIX コマンドと bash シェルを使用するソリューションを提案します。

答え1

各行の最初の2つの単語を選択できますfile2

$ cut -d' ' -f1-2 file1 
& program

したがって、これを使用して次の操作を実行できます。

$ printf '%s %s\n' "$(cat file2)" "$(cut -d' ' -f1-2 file1)" > file3
$ cat file3
Hello
World
This is a sample output & program

ファイルに複数の行がある可能性があり、最初の行だけが必要な場合は、以下を渡してくださいhead

printf '%s %s\n' "$(cat file2)" "$(cut -d' ' -f1-2 file1 | head -n1)"

答え2

私の考えではテドンの答え2番目のファイルが短いことを知っていれば大丈夫です。ファイルが短いことを知らない場合や、ファイルが十分に長いことを知っていて、コマンドのオーバーライドを読み取らないようにするには、次のようにファイルの最後の行を超えてファイルを拡張しないように選択できます。

{
    sed '$d' file2
    printf '%s %s\n' "$( tail -n 1 file2 )" "$( cut -d ' ' -f -2 file1 )"
} >file3

まずsed、出力の最後の行を除くすべての項目に対してfile2terdonコードの修正されたバリエーションを使用して、最後の行とスペースでfile2区切られた最初の2つの単語を出力しますfile1

答え3

小さなプログラムが利用可能ですed

ed -s file2 << \EOF
$r !cut -d " " -f1,2 file1
-1,.j
w file3
EOF

または文章で:

printf '%s\n' '$r !cut -d " " -f1,2 file1' '-1,.j' 'w file3' | ed -s file2

答え4

そしてawk

awk 'NR==FNR { append=$1 OFS $2; next }
prev!=""{ print prev } { prev=$0 }
END{ print prev, append }' file1 file2

現在の行を一時変数に保存すると、出力行がprev1つずつ遅延するため、すべての行の処理中にファイル1のテキストがファイル2の最後の行に追加されます。

関連情報