A、B、Cファイルがあります。ファイルA、B、Cをリンクしたい(Cの最初の行をスキップ)その後、myProgramに入力として送信します。これをシェルスクリプトでどのように書くことができますか?
私が書いたこと
cat A > file
echo >> file //want to start all contents in new line
cat B >> file
tail -n+2 C >> file
./myProgram < file
しかし、ファイルを生成せずに接続してプログラムに送信する方法がわかりません。
答え1
この試み:
{ cat A ; echo; cat B ; awk 'NR>1' C ; } | programm
その中に命令を入れてみてください大きな括弧はいグループ。
;
改行文字なしで行われた場合は必須ではありません。グループ。
他は必要ありません。サブシェルここ;)
答え2
プロセス交換の使用
./myProgram < <(cat A; echo ''; cat B; tail -n +2 C)
<(commands)
FIFOファイルを生成し、プログラムに読み込みます。
以下を実行してこれをテストできます。
$ echo <(cat A; echo ''; cat B; tail -n +2 C) /dev/fd/63
プロセス置換は、名前付きパイプ(FIFO)または/ dev / fd名前付きファイルを開く方法をサポートするシステムでサポートされています。 <(リスト)または>(リスト)形式を使用します。プロセスリストの入力または出力は、FIFOまたは/dev/fdのファイルにリンクされます。ファイル名は、拡張結果として現在のコマンドに引数として渡されます。 >(リスト)形式を使用している場合は、ファイルに書き込むとリストへの入力が提供されます。 <(リスト)形式を使用している場合は、リストの出力を取得するには引数として渡されたファイルを読み取る必要があります。可能であれば、プロセス置換は、パラメータおよび変数拡張、コマンド置換、および算術拡張と同時に実行されます。
答え3
サブシェルを使用してください。サブシェルでコマンドを実行し、出力をプログラムにパイプします。
(cat a; echo; cat b; tail -n+2 c) | ./myProgram
答え4
awkメソッド
awk 'ARGIND<3;ARGIND==3&&FNR>1' a b c | ./myProgram