cat file:a b c a d a
s d d d x s a
h j s a s h j h
j d f j a s j k j
要求:删除行内与第一列字符重复的字符,shell、sed、awk各写一个。达到这个结果:
a b c d
s d d d x a
h j s a s j
j d f a s k
shell版:
- while read a b;do echo "$a ${b// $a}";done <file
[解析]
while可以读取数个变量,第一个变量代表第一个字符串(由IFS变量决定分割符),第二个代表变量代表第二个,依次类推,但是最后一个变量则代表剩下的所有,那么这里 $a 这是第一个字符串,$b 则是剩下的所有字符串,然后再对 $b 中的含有 $a 的进行全部替换为空。
awk版:
- awk '{a=$1;gsub(" ?"a,"");print a""$0}' file
[解析]
其实所有的原理都是替换,awk呢利用 gsub() 进行全局替换,这点注意双引号内的问号,这是一个正则,在双引号中使用正则,学名叫 Dynamic Regexps 。
sed版:
- sed ':a;s/^\(.\)\(.*\) \1/\1\2/;ta' file
[解析]
这个也是一样的,利用 t label 来完成替换。
阅读(4928) | 评论(3) | 转发(5) |