检测awk

时间:2015-07-16 21:20:06

标签: bash 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

...

谢谢。

3 个答案:

答案 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

但没有可测试的样本输入/输出,这是一个未经测试的猜测。