我在尝试拆分文件时遇到问题。谁能帮我解决这个问题?
示例内容:
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
您能否尝试以下(未经测试,因为未给出样本(,以防 Sun o.s 使用 /usr/xpg4/bin/awk
OR /usr/xpg6/bin/awk
(有关更多详细信息,请参阅此答案中的评论(。
似乎 OP 使用的是 OLD 损坏awk
close
其中的功能无法正常工作以下解决方案,所以我建议 OP 使用xpg
尴尬,后来 Ed sir 也证实了这一点。
#!/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
您可能用完了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命令,甚至不够聪明,无法给出错误说"我不知道close是什么意思"。
如果您没有使用 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
希望通过拆分,您希望将每个字段 #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 中的元素标记为 dealt。
system("echo "$1" >> file"$2".htm");
执行 bash 命令 " echo field#1 >> filefield#2.html