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
、出力の最後の行を除くすべての項目に対してfile2
terdonコードの修正されたバリエーションを使用して、最後の行とスペースで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
現在の行を一時変数に保存すると、出力行がprev
1つずつ遅延するため、すべての行の処理中にファイル1のテキストがファイル2の最後の行に追加されます。