sed 分隔符打印_sed/awk 处理加前5个分割符

1,2,3,4,...198,199,200

a,b,c,d,...x,y,z

a1,a2,a3

指定任一数值n,如n=5,生成格式如下

1|2|3|4|5,6,7,...198,199,200

a|b|c|d|e,f,g,...x,y,z

a1|a2|a3

即field为n之前的分隔符用指定字符串替换,如|,之后的不变。

sed :

sed -r ':a;s/,/|/;/(.*\|){4}/!ta' file

1: :a  定义标签。 与 !!ta相呼应。(标签相当于判断条件。

2:前面的替换成立,也后面重复四次,!表示后面的命令对所有没有被选定的行发生作用。即跳转到标签a

======

b label

Branch to label; if label is omitted, branch to end of script.

t label

If a s/// has done a successful substitution since the last input line was read and since the last t or T command, then branch to label; if  label

is omitted, branch to end of script.

T label

If no s/// has done a successful substitution since the last input line was read and since the last t or T command, then branch to label; if label

is omitted, branch to end of script.

标签在sed当中的作用就是跳转。从manpage可以得知,t lable和T lable的作用是相反的,那么我们主要来看看b lable和t lable。接下来实例说明,首先,创造个文件:

[root@A ~]# cat b

The colour is red

The colour is green

The colour is black

The colour is yellow

执行以下语句:

[root@A ~]# sed '{/colour/b lable;s/colour/COLOUR/;:lable; s/$/ \!/}' b

The colour is red !

The colour is green !

The colour is black !

The colour is yellow !

我们看到,执行了sed命令后在文件的每一行后面加上了“!”,而并没有将“colour”替换成为“COLOUR”。可以看到,我们定义了一个标签lable(:lable),那么这条语句的作用就是如果匹配到了colour(/colour/),那么就跳转到标签lable处继续执行下面的命令(s/$/ \!/),而略过了(s/colour/COLOUR/),这就是b lable的作用。接着看:

执行以下语句(这是sed1line中的一个例子):

[root@A ~]# sed '{:a;s/^.\{1,78\}$/ &/;ta}' b

The colour is red

The colour is green

The colour is black

The colour is yellow

可以看出,语句执行后,文件中的每一行都占用了79个字符并且右对齐了,那么sed语句是怎么得到这个结果的呢?首先,设置了一个标签(:a),接下来执行s/^.\{1,78\}$/ &/,它的作用是在每一行原本内容的前面补一个空格,如果执行成功,那么就继续执行ta,ta是什么意思?这就是我们要说的条件跳转,只有当它前面的替换成功了,才会执行ta,如果前面的替换不成功,那么sed对这一行的处理就over了,该下一行了,就这么简单。在这个例子中,实际上:a.....ta形成了一个循环,它不停的执行替换,直到这一行的字符数量达到了78加上一个空格共79个的时候,那么循环停止,也就是替换不成功了,那么就不会再执行ta了,sed会接着开始处理下一行。

==============================================

awk:

awk -vn=5 -F, '{s=$1;for(c=2;c<=NF;++c){f=(c<=n)?"|":",";s=s f $c}print s}'

-v的后面紧跟着变量名字和对变量的赋值,在awk语句中可以直接使用此变量

'{

s=$1;

for(c=2;c<=NF;++c)

{

f=(c<=n)?"|":",";

s=s f $c

}

print s

}'

before

s=1, f="|", $c="2"

after:

s= "1|2"

before

s="1|2", f="|", $c="3"

after:

s= "1|2|3"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值