Sed 将嵌套字段拆分为两个新字段,保持顺序

Sed 将嵌套字段拆分为两个新字段,保持顺序,sed,awk,cut,Sed,Awk,Cut,我一直在尝试破坏一个示例文件,如下所示,这样第三列将变成两部分,同时保持文件中的顺序 100 400 500.00苹果5.8 9.2 200 300 600.00狗5.3 9.1 300 763 454.44小猫5.7 9.2 应该导致 100 400 500.00苹果5.8 9.2 200 300 600.00狗5.3 9.1 300 763 454.44小猫5.7 9.2 我曾在awk中尝试过这样做,但似乎有问题 注:在正则表达式中,要分隔的点始终是一个数字[0-9],后跟[a-zA-Z]。

我一直在尝试破坏一个示例文件,如下所示,这样第三列将变成两部分,同时保持文件中的顺序

100 400 500.00苹果5.8 9.2

200 300 600.00狗5.3 9.1

300 763 454.44小猫5.7 9.2

应该导致

100 400 500.00苹果5.8 9.2

200 300 600.00狗5.3 9.1

300 763 454.44小猫5.7 9.2

我曾在awk中尝试过这样做,但似乎有问题

注:在正则表达式中,要分隔的点始终是一个数字[0-9],后跟[a-zA-Z]。

试试:

sed 's/\([0-9]\)\([A-Z]\)/\1 \2/' ./infile
概念证明
或者,如果您有
gawk
,您可以使用以下命令将拆分限制为仅第三个字段:

awk '{$3=gensub(/([0-9])([A-Z])/,"\\1 \\2","",$3)}1' ./infile
概念证明
太神了谢谢我觉得这可以在sed中完成。。。我花了一些时间看了看你的解决方案是如何工作的,但现在我明白了。@jp:没问题。请注意,
sed
脚本将第一次出现的数字拆分为一个字母。如果在第一个或第二个字段中有出现此图案的行,它将拆分该行。如果您想确保拆分只发生在第三个字段上,那么
awk
脚本就是一个不错的选择。为了理解起见,假设我想进一步扩展这一点,用#符号代替空格,但只能在数字之间。即100 400 500.00苹果5.8 9.2变为100 400 500.00苹果5.8 9.2。我试图更好地理解\1和\2,但显然它只匹配第一次、第二次出现。如果sed支持更复杂的temp变量,比如holder,那就太好了(但也许它支持?)。再次感谢。啊,我一次就拿到了s/([0-9])([0-9])/\1\35;\ 2/gOr:
sed-e的//\35;/g'-e的/\([0-9]\)\([A-Z]\)/\1\2/“文件
awk '{$3=gensub(/([0-9])([A-Z])/,"\\1 \\2","",$3)}1' ./infile
$ awk '{$3=gensub(/([0-9])([A-Z])/,"\\1 \\2","",$3)}1' ./infile
100 400 500.00 APPLE 5.8 9.2
200 300 600.00 DOG 5.3 9.1
300 763 454.44 KITTEN 5.7 9.2