![](/img/trans.png)
[英]replacing second column with first column using awk with multiple separators
[英]Detect column separators in awk
我正在尝试使用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
....
谢谢。
使用此输入文件,
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
没有标题,典型的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
如注释中所建议,您可以将>>
替换为>
。
它听起来像您需要的是:
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
但是没有可测试的示例输入/输出,这是未经测试的猜测。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.