awk: 太多输出文件 10 记录号 12
awk: too many output files 10 record number 12
我在尝试拆分文件时遇到问题。
谁能帮我解决这个问题?
示例内容:
apple fruit
goa fruit
tomato vegetable
tiger animal
脚本:
#!/bin/bash
awk 'FNR==1 { hdr = [=11=]; next }
{
if(!f[]) { print hdr >"file" ".htm"; f[] = 1 }
print >>"file" ".htm"
}' samplefile.txt
能否请您尝试以下(未测试,因为未提供样品),如果太阳 o.s 使用 /usr/xpg4/bin/awk
或 /usr/xpg6/bin/awk
(请参阅此答案中的评论以获取更多详细信息也是)。
似乎 OP 使用的是旧的损坏的 awk
,其中 close
函数无法使用以下解决方案,因此我建议 OP 使用 xpg
awk(s),后来的 Ed先生也确认了。
#!/bin/bash
awk 'FNR==1 { hdr = [=10=]; next }
{
if( != prev){close(file)}
file="file" ".htm"
if(!f[]) {print hdr > file; f[] = 1 }
print >> file
prev=
}' samplefile.txt
或尝试:
#!/bin/bash
awk 'FNR==1 { hdr = [=11=]; next }
{
file="file" ".htm"
if(file!=prev){close(prev)}
if(!f[]) {print hdr > file; f[] = 1 }
print >> file
prev=file
}' samplefile.txt
你可能 运行 没有 FD,使用 close()
并尝试类似的东西:
$ awk '
FNR==1 {
hdr = [=10=]
next
}
{
filename="file" ".htm"
if(!f[]) {
print hdr >> filename
f[] = 1
}
print >> filename
close(filename)
}' file
哦,TIL:旧的 [Solaris] awk 没有关闭命令,甚至不够聪明,无法给出错误 "I don't know what close means".
如果您没有使用 GNU awk(它会在后台为您执行此操作),那么您需要手动关闭由于输入或输出重定向而打开的所有文件 - 您正在手动打开它们所以你需要手动关闭它们:
awk '
FNR==1 { hdr = [=10=]; next }
!= prev {
close(out)
out = "file" ".htm"
if ( !seen[out]++ ) {
print hdr > out
}
prev =
}
{ print >> out }
' samplefile.txt
希望通过拆分将每个字段 #1 分配给其对应的文件。
这是单行 awk 脚本:
awk ' in uniqSet == 0 {uniqSet[]=1;system("echo "" >> file"".htm");}' input
解释:
in uniqSet == 0
仅处理尚未处理的元素,元素不在 uniqSet 中。
uniqSet[]=1;
将 uniqSet 中的元素标记为处理。
system("echo "" >> file"".htm");
执行 bash 命令“echo field#1 >> filefield#2.html
”
我在尝试拆分文件时遇到问题。 谁能帮我解决这个问题?
示例内容:
apple fruit
goa fruit
tomato vegetable
tiger animal
脚本:
#!/bin/bash
awk 'FNR==1 { hdr = [=11=]; next }
{
if(!f[]) { print hdr >"file" ".htm"; f[] = 1 }
print >>"file" ".htm"
}' samplefile.txt
能否请您尝试以下(未测试,因为未提供样品),如果太阳 o.s 使用 /usr/xpg4/bin/awk
或 /usr/xpg6/bin/awk
(请参阅此答案中的评论以获取更多详细信息也是)。
似乎 OP 使用的是旧的损坏的 awk
,其中 close
函数无法使用以下解决方案,因此我建议 OP 使用 xpg
awk(s),后来的 Ed先生也确认了。
#!/bin/bash
awk 'FNR==1 { hdr = [=10=]; next }
{
if( != prev){close(file)}
file="file" ".htm"
if(!f[]) {print hdr > file; f[] = 1 }
print >> file
prev=
}' samplefile.txt
或尝试:
#!/bin/bash
awk 'FNR==1 { hdr = [=11=]; next }
{
file="file" ".htm"
if(file!=prev){close(prev)}
if(!f[]) {print hdr > file; f[] = 1 }
print >> file
prev=file
}' samplefile.txt
你可能 运行 没有 FD,使用 close()
并尝试类似的东西:
$ awk '
FNR==1 {
hdr = [=10=]
next
}
{
filename="file" ".htm"
if(!f[]) {
print hdr >> filename
f[] = 1
}
print >> filename
close(filename)
}' file
哦,TIL:旧的 [Solaris] awk 没有关闭命令,甚至不够聪明,无法给出错误 "I don't know what close means".
如果您没有使用 GNU awk(它会在后台为您执行此操作),那么您需要手动关闭由于输入或输出重定向而打开的所有文件 - 您正在手动打开它们所以你需要手动关闭它们:
awk '
FNR==1 { hdr = [=10=]; next }
!= prev {
close(out)
out = "file" ".htm"
if ( !seen[out]++ ) {
print hdr > out
}
prev =
}
{ print >> out }
' samplefile.txt
希望通过拆分将每个字段 #1 分配给其对应的文件。 这是单行 awk 脚本:
awk ' in uniqSet == 0 {uniqSet[]=1;system("echo "" >> file"".htm");}' input
解释:
in uniqSet == 0
仅处理尚未处理的元素,元素不在 uniqSet 中。
uniqSet[]=1;
将 uniqSet 中的元素标记为处理。
system("echo "" >> file"".htm");
执行 bash 命令“echo field#1 >> filefield#2.html
”