在行的一部分上使用 awk 字段分隔符,直到某些唯一字符



假设我有一个输入文本文件.txt其中包含:

0.3340     0.2333  0.1029     .0349  .2302 [ blah blah ] 
0.2223     0.2343  0.2394     .4395  .7943 [ blah2 blah2 ] 

并且数字之间存在可变数量的空格。

我想输出:

0.334,0.2333,0.1029,.0349,.2302 [ blah blah ]
0.2223,0.2343,0.2394,.4395,.7943 [ blah2 blah2 ] 

进行进一步处理。

awk 'BEGIN { OFS = "," }{ print $1, $2, $3, $4, $5 }' textFile.txt 

如何将我想要的字段分隔符与搜索左括号结合起来,并告诉它输出左括号后未修改的内容?

根据示例输入,您希望在由多个空格分隔的字段之间使用逗号。 如果是这种情况:

$ awk -F'  +' '$1=$1' OFS=, text.txt
0.3340,0.2333,0.1029,.0349,.2302 [ blah blah ] 
0.2223,0.2343,0.2394,.4395,.7943 [ blah2 blah2 ] 

工作原理:

  • -F' +'

    这会告诉 awk 将两个或多个空白视为字段分隔符。

  • $1=$1

    这让awk认为这条线已经改变了。 因此,awk 将使用新的字段分隔符重新格式化输出上的行。

  • OFS=,

    这会告诉 awk 使用逗号作为输出字段分隔符。

GNU awk 解决方案:

awk -v FPAT='[0-9]?\.[0-9]+|\[[^][]+\]' 
      '{ for (i=1; i<=NF; i++) printf "%s%s", $i, (i == NF? ORS : ",") }' file
  • FPAT - 内置变量;定义字段值的模式

输出:

0.3340,0.2333,0.1029,.0349,.2302,[ blah blah ]
0.2223,0.2343,0.2394,.4395,.7943,[ blah2 blah2 ]

我会使用左括号(实际上是"空格+括号"(作为字段分隔符,并替换第一个中的空格田:

gawk -F' \[' -v OFS=' [' '{gsub(/[[:blank:]]+/,",",$1); print }'

需要 GNU awk,我相信。

最新更新