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

在行的一部分使用awk字段分隔符,直到某个唯一字符,awk,sh,Awk,Sh,假设我有一个输入textFile.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 [ blah

假设我有一个输入textFile.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 

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

GNU
awk
解决方案:

awk -v FPAT='[0-9]?\\.[0-9]+|\\[[^][]+\\]' \
      '{ for (i=1; i<=NF; i++) printf "%s%s", $i, (i == NF? ORS : ",") }' file

根据示例输入,在由多个空格分隔的字段之间需要逗号。如果是这样的话:

$ 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 -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 ] 
      
      gawk -F' \\[' -v OFS=' [' '{gsub(/[[:blank:]]+/,",",$1); print }'