awkの出力を指定されたディレクトリ内の複数の個別のファイルに送信する方法

awkの出力を指定されたディレクトリ内の複数の個別のファイルに送信する方法

awkの出力を指定されたディレクトリ内の個々のファイルに送信することはできません。作業ディレクトリでこれを正常に実行し、mvコマンドを最後までリンクできますが、指定されたawkディレクトリにファイルを保存するためにのみ使用したいと思います。

ちなみに、以下はmessages.txt別々のメッセージファイルに分割したい単純化されたものです。

messageHeader:
  mh_field1: mh_val1
  mh_field2: mh_val2
messageData:
  md_field1: md_val1
  md_field2: md_val2

messageHeader:
  mh_field1: mh_val1
  mh_field2: mh_val2
messageData:
  md_field1: md_val1
  md_field2: md_val2

messageHeader:
  mh_field1: mh_val1
  mh_field2: mh_val2
messageData:
  md_field1: md_val1
  md_field2: md_val2

以下を使用して、メッセージファイルを別々のメッセージに正常に分割し、各メッセージを作業ディレクトリの別々のファイルに出力することができました。

awk -v RS= '{print > ("message" NR ".txt")}'

作業ディレクトリにmessage1.txt、およびを作成しますmessage2.txt。次のmessage3.txtようにmv、この基本コマンドの最後にコマンドを接続して、出力を指定されたディレクトリに移動することもできます。

out = "$(pwd)/messages"
mkdir -p $out
awk -v RS= '{print > ("message" NR ".txt")}' && mv message*.txt $out

message1.txt、およびをmessage2.txt生成します。しかし、justの使い方はわかりません。 message3.txt./messagesawk

たとえば、次のようにメッセージファイルを分割し、個々のメッセージを指定された出力ディレクトリに出力してみました。

out="$(pwd)/messages"
mkdir -p $out
awk -v RS= '{print > ($out "message" NR ".txt")}' messages.txt

これにより、次のエラーが発生します。

awk: cmd. line:1: (FILENAME=- FNR=1) fatal: can't redirect to 'messageHeader:
  mh_field1: mh_val1 
  mh_field2: mh_val2
messageData:
  md_field1: md_val1
  md_field2: md_val2message1.txt' (file name too long)

次の関連質問を見つけました。」awkを使用してファイルを分割し、別のディレクトリに結果を生成します。「しかし、まだ正しい構文を得ることはできません。

out="$(pwd)/messages"
mkdir -p $out
awk -v RS= path=$out '{f=path "message" NR ".txt"; print > f}' messages.txt 

awk: fatal: cannot open file `{f=path "message" NR ".txt"; print > f}' for reading (No such file or directory)

ベストアンサー1

@steeldriverのコメントによると、不足して-v正しい構文が生成されます。

out="$(pwd)/messages"
mkdir -p $out
awk -v RS= -v path="$out" '{f=path "message" NR ".txt"; print > f}' messages.txt

おすすめ記事