awk处理未格式化的输入

时间:2015-01-06 17:08:52

标签: awk

想知道如何处理下面的情况,样本输入由空格分隔,并希望格式化为逗号分隔输出。 直到第一个以数字开头的字段为止的所有文本都应被视为输出中的单个字段。在样本数据中,一行的末尾总是有3个数字字段;在实际数据中,有14个这样的领域。

INPUT.TXT

mmm 4394850 4465411 2579770
xxx yyy 2155419 2178791 1516446
aaa bbb (incl. ccc) 14291585 14438704 6106341
U.U.(W) 6789781 6882021 5940226
nnn 7335050 7534302 2963345

尝试过以下命令,但我知道它不完整:

awk 'BEGIN {FS =" "; OFS = ","} {print $1,$2,$3,$4,$5,$6} ' Input.txt

期望的输出:

mmm,4394850,4465411,2579770
xxx yyy,2155419,2178791,1516446
aaa bbb (incl. ccc),14291585,14438704,6106341
U.U.(W),6789781,6882021,5940226
nnn,7335050,7534302,2963345

3 个答案:

答案 0 :(得分:2)

使用GNU awk for gensub():

$ awk '{match($0,/[0-9 ]+$/); print substr($0,1,RSTART-1) gensub(/ /,",","g",substr($0,RSTART,RLENGTH))}' file
mmm,4394850,4465411,2579770
xxx yyy,2155419,2178791,1516446
aaa bbb (incl. ccc),14291585,14438704,6106341
U.U.(W),6789781,6882021,5940226
nnn,7335050,7534302,2963345

使用其他awks,在var中保存第二个substr()输出并使用gsub():

awk '{match($0,/[0-9 ]+$/); digs=substr($0,RSTART,RLENGTH); gsub(/ /,",",digs); print substr($0,1,RSTART-1) digs}' file

答案 1 :(得分:1)

假设它是最后3列的数字(如你的例子中所示):

awk '{for(i=1;i<=NF;++i)printf "%s%s",$i,(i<NF-3?OFS:(i<NF?",":ORS))}' file

基本上打印每个字段,后跟空格,逗号或换行符,具体取决于字段编号。

答案 2 :(得分:1)

另一个awk

awk '$0=gensub(/ ([0-9]+)/,",\\1","g")' file


mmm,4394850,4465411,2579770
xxx yyy,2155419,2178791,1516446
aaa bbb (incl. ccc),14291585,14438704,6106341
U.U.(W),6789781,6882021,5940226
nnn,7335050,7534302,2963345