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 -v
n=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"
阅读(1677) | 评论(0) | 转发(0) |