尝试分割文件时出现问题。 有人可以帮我吗?
样本内容:
apple fruit
goa fruit
tomato vegetable
tiger animal
脚本:
#!/bin/bash
awk 'FNR==1 { hdr = $0; next }
{
if(!f[$2]) { print hdr >"file" $2".htm"; f[$2] = 1 }
print >>"file" $2".htm"
}' samplefile.txt
答案 0 :(得分:1)
如果太阳晒太阳,请使用/usr/xpg4/bin/awk
或/usr/xpg6/bin/awk
(请参阅此答案中的注释以获取更多详细信息)。 >
好像OP正在使用OLD损坏的awk
,其中close
函数在以下解决方案中不起作用,因此我建议OP使用xpg
awk,稍后Ed先生确认那也是。
#!/bin/bash
awk 'FNR==1 { hdr = $0; next }
{
if($2 != prev){close(file)}
file="file" $2 ".htm"
if(!f[$2]) {print hdr > file; f[$2] = 1 }
print >> file
prev=$2
}' samplefile.txt
或尝试:
#!/bin/bash
awk 'FNR==1 { hdr = $0; next }
{
file="file" $2 ".htm"
if(file!=prev){close(prev)}
if(!f[$2]) {print hdr > file; f[$2] = 1 }
print >> file
prev=file
}' samplefile.txt
答案 1 :(得分:0)
您可能用完了FD,请使用close()
并尝试以下操作:
$ awk '
FNR==1 {
hdr = $0
next
}
{
filename="file" $2 ".htm"
if(!f[$2]) {
print hdr >> filename
f[$2] = 1
}
print >> filename
close(filename)
}' file
哦,TIL:旧的[Solaris] awk没有close命令,甚至还不够聪明,无法发出错误消息“我不知道关闭意味着什么”。 < / p>
答案 2 :(得分:0)
如果您不使用GNU awk(在后台为您执行此操作),则您需要随手关闭由于输入或输出重定向而打开的所有文件-您正在手动打开它们,因此需要手动关闭它们:
awk '
FNR==1 { hdr = $0; next }
$2 != prev {
close(out)
out = "file" $2 ".htm"
if ( !seen[out]++ ) {
print hdr > out
}
prev = $2
}
{ print >> out }
' samplefile.txt
答案 3 :(得分:0)
希望通过拆分将每个字段#1分配给其对应的文件。 这是一个单行的awk脚本:
awk '$1 in uniqSet == 0 {uniqSet[$1]=1;system("echo "$1" >> file"$2".htm");}' input
$1 in uniqSet == 0
仅处理尚未处理的元素,不在uniqSet中的元素。
uniqSet[$1]=1;
标记uniqSet中的元素为已处理。
system("echo "$1" >> file"$2".htm");
执行bash命令“ echo field#1 >> filefield#2.html
”