awk 处理未格式化的输入
awk to handle un formatted input
想知道如何处理以下情况,示例输入由 space 分隔并希望格式化为逗号分隔的输出。
一行中的所有文本,直到第一个以数字开头的字段,都应被视为输出中的单个字段。在示例数据中,一行的末尾总是有 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 ,,,,,} ' 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
使用 GNU awk for gensub():
$ awk '{match([=10=],/[0-9 ]+$/); print substr([=10=],1,RSTART-1) gensub(/ /,",","g",substr([=10=],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 一起,将第二个 substr() 输出保存在 var 中并使用 gsub():
awk '{match([=11=],/[0-9 ]+$/); digs=substr([=11=],RSTART,RLENGTH); gsub(/ /,",",digs); print substr([=11=],1,RSTART-1) digs}' file
假设最后 3 列是数字(如您的示例):
awk '{for(i=1;i<=NF;++i)printf "%s%s",$i,(i<NF-3?OFS:(i<NF?",":ORS))}' file
基本上打印每个字段后跟 space、逗号或换行符,具体取决于字段编号。
另一个 awk
awk '[=10=]=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
想知道如何处理以下情况,示例输入由 space 分隔并希望格式化为逗号分隔的输出。 一行中的所有文本,直到第一个以数字开头的字段,都应被视为输出中的单个字段。在示例数据中,一行的末尾总是有 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 ,,,,,} ' 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
使用 GNU awk for gensub():
$ awk '{match([=10=],/[0-9 ]+$/); print substr([=10=],1,RSTART-1) gensub(/ /,",","g",substr([=10=],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 一起,将第二个 substr() 输出保存在 var 中并使用 gsub():
awk '{match([=11=],/[0-9 ]+$/); digs=substr([=11=],RSTART,RLENGTH); gsub(/ /,",",digs); print substr([=11=],1,RSTART-1) digs}' file
假设最后 3 列是数字(如您的示例):
awk '{for(i=1;i<=NF;++i)printf "%s%s",$i,(i<NF-3?OFS:(i<NF?",":ORS))}' file
基本上打印每个字段后跟 space、逗号或换行符,具体取决于字段编号。
另一个 awk
awk '[=10=]=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