我正在尝试使用awk在各种文件中分隔初始的* .txt文件。我得到以下格式。
inline xline X Y Horizon Time
1 159 806313 939258 KF2 0.80
....
81 149 805004 948030 FallRiver 0.85965
....
243 146 804252 965837 TensleepBbase 1.1862
在这种情况下,我的分隔符是第五列(KF2,FallRiver,TensleepBbase)。我的想法是在第五列的值发生变化时迭代并打破循环,但我不知道如何在AWK中构造算法。
预期的结果是3个txt文件。每个Horizon关键字一个:
FILE1.TXT
inline xline X Y Horizon Time
1 159 806313 939258 KF2 0.80
...
end of KF2 Horizon keyword
FILE2.TXT
inline xline X Y Horizon Time
81 149 805004 948030 FallRiver 0.85965
...
end of FallRiver Horizon keyword
...
谢谢。
答案 0 :(得分:1)
使用此输入文件
inline xline X Y Horizon Time
1 159 806313 939258 KF2 0.80
2 9 806313 939258 KF2 0.80
3 59 806313 939258 KF2 0.80
81 149 805004 948030 FallRiver 0.85965
82 345 5678 948030 FallRiver 0.85965
243 146 804252 965837 TensleepBbase 1.1862
我会这样做:
awk 'NR==1 { hdr=$0;next} # Pick up column headers, and avoid other processing
{ hrz=$5; # Save current horizon
if(hrz!=oldhrz){ # Check if horizon has changed
if(length(oldhrz)>0)print "End of ",oldhrz > file
file=++f ".txt" # Work out name of output file
print hdr > file # Print column headers to new file
oldhrz=hrz # Remember which is the current horizon
}
print > file
}
END { print "End of ",hrz > file}' input.txt
<强>输出强>
的1.txt
inline xline X Y Horizon Time
1 159 806313 939258 KF2 0.80
2 9 806313 939258 KF2 0.80
3 59 806313 939258 KF2 0.80
End of KF2
2.txt
inline xline X Y Horizon Time
81 149 805004 948030 FallRiver 0.85965
82 345 5678 948030 FallRiver 0.85965
End of FallRiver
3.txt
inline xline X Y Horizon Time
243 146 804252 965837 TensleepBbase 1.1862
End of TensleepBbase
答案 1 :(得分:0)
没有标题,典型的awk用例
awk '{print > $5}' infile
消除标题
awk 'NR>1{print > $5}' infile
输出文件虽然会丢失标题。对于处理标题,
awk 'NR==1{header=$0;next} !k[$5]++{print header > $5} {print >> $5}' infile
它抓取标题,使用标题按列5值创建唯一文件,并将这些行附加到相应的文件。
如果要将FileX.txt用作文件名而不是字段值。你也可以映射它们
awk 'NR==1{header=$0;next} !k[$5]++{f[$5]="File"++i".txt"; print header > f[$5]} {print >> f[$5]}' infile
最后,通过迭代所有唯一条目,可以在END
语句中添加页脚
awk 'NR==1{header=$0;next} !k[$5]++{f[$5]="File"++i".txt"; print header > f[$5]} {print >> f[$5]} END{for(t in f) print "End of "t" Horizon Keyword" >> f[t]}' infile
根据评论中的建议,您可以将>>
替换为>
。
答案 2 :(得分:0)
声音就像你需要的一样:
awk '
NR==1 { hdr=$0; fldNr=5; fldName=$fldNr; next }
$fldNr != prev {
if (out) {
print "end of", prev, fldName, "keyword" > out
}
out="File" ++cnt ".txt"
print hdr > out
prev=$fldNr
}
{ print > out }
END { print "end of", prev, fldName, "keyword" > out }
' file
但没有可测试的样本输入/输出,这是一个未经测试的猜测。