用于处理未格式化输入的awk

用于处理未格式化输入的awk,awk,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 688

想知道如何处理下面的情况,示例输入由空格分隔,并希望格式化为逗号分隔的输出。 在第一个以数字开头的字段之前,一行中的所有文本都应视为输出中的单个字段。在样本数据中,在一行的末尾总是有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
对于gensub(),使用GNU awk:

对于其他awk,将第二个substr()输出保存在一个var中并使用gsub():

对于gensub(),使用GNU awk:

对于其他awk,将第二个substr()输出保存在一个var中并使用gsub():


假设最后3列是数值列(如您的示例所示):


awk'{for(i=1;i假设最后3列是数字列(如您的示例所示):

awk'{for(i=1;i另一个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
另一个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

在您尝试处理数字字段时,没有逻辑尝试以不同的方式处理。输入是否始终采用相同的格式?例如,每行末尾是否始终有3个数字字段?Tom Fenech,每行末尾有14个数字字段在您尝试处理数字字段时,没有逻辑尝试处理数字字段ELD不同。输入的格式是否始终相同?例如,每行末尾是否始终有3个数字字段?Tom Fenech,每行末尾有14个数字字段Tom Fenech,非常感谢,但如果输入行是a&B 8399153 8530270 131117,则上述命令失败。输出是a,&,B,839915385302701311117I无法r使用我的代码生成那个输出。你们是否使用了代码中的
BEGIN
块或其他什么?Tom Fenech,是的,我理解这个问题,最后一列数字字段并不总是像14个字段那个样恒定,有些行有14个字段,有些行有10个数字字段,非常感谢,但若输入行是A&B 8399153 8530270 131117输出是A,&,B,83991538530270131117我不能用我的代码复制那个输出。你们是否使用了代码中的
BEGIN
块或其他什么?Tom Fenech,是的,我理解这个问题,最后一列数字字段并不总是像14个字段一样恒定,有些行有14个字段,其中一些用于10个数值场等
awk '{for(i=1;i<=NF;++i)printf "%s%s",$i,(i<NF-3?OFS:(i<NF?",":ORS))}' file
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