繁体   English   中英

在awk中检测列分隔符

[英]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文件。 每个Horizo​​n关键字一个:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM