我无法将 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
,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