如何将 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.txtmessage2.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,message3.txt./messages。但是,我无法弄清楚如何仅使用awk.

例如,我尝试拆分消息文件并将各个消息输出到指定的输出目录,如下所示:

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

相关内容