shell下处理文本内容的几个有效命令

来源:互联网 发布:10月经济数据公布 编辑:程序博客网 时间:2024/05/16 18:15


原文地址:http://5007260.blog.51cto.com/4997260/1316163

1、rev(将文本横向倒置)

取出下面11文档中等号后面的内容,并且去掉每行内容最后3个字符,这个通过一个简单的rev命令便可以很容易实现

232549578.jpg

2、tac(将文本纵向倒置)

通常可以合sed结合,将多个文本的最后一行或者多行替换掉

233513267.jpg

总结:shell许多命令都是顺序处理文本,针对逆序处理的情况似乎不好定位,但是有了上面两个命令,很多情况就明朗啦,所谓“负负得正”的原理,嘿嘿

3、awk中让数组下标有序输出和数组value有序输出

一般做法:awk '{b[$1]=$2}END{for(i in b)print i,b}' 此时输出的数组下标不是文件里原有的顺序,也就是乱序了。
解决办法:awk '{a[$1]=$2;c[j++]=$1}END{for(m=0;m<j;m++)print c[m],a[c[m]]}'
当然c了上面的方法外,还有一个更简便的方法用asorti()函数来实现,原理是一样的


test数据文件:
12 34
78 90
23 45

awk '{a[$1]=$2}END{slen=asorti(a,b);for(i=1;i<=slen;i++) print i"\t"b[i]"\t"a[b[i]]}' test

1 12 34
2 23 45
3 78 90
在最后执行命令,END中 asorti对数组a的下标进行排序,并把排序后的下标存入新生成的数组b中,并把数组a的长度赋值给变量l。

假如要做数组value排序呢?asorti类似的一个方法asort可以实现,例子如下

awk '{a[$1]=$2}END{slen=asort(a,b);for(i=1;i<=slen;i++) print i"\t"a[i]"\t"b[i]}' test
1 34
2 45
3 90

个人认为此函数用处不多,因为将原来的数组下标给丢掉了,如果想对value排序,又不丢掉数组下标,将awk的结果用shell下的sort命令实现更加人性化,可能多了一层管道,效率会相对低一些。

总结下awk的两排序函数区别:

asort 是对数组的值进行排序,并且会丢掉原先键值;
asorti是对数组的下标进行排序。

4:shell下的数组:注:BASH只支持一维数组,但参数个数没有限制。

声明一个数组:

declare -a array

(其实不用声明,按数组方式直接赋值给变量即可,BASH就知道那是数组)

数组赋值:

(1) array=(var1 var2 var3 ... varN)

(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)

(3) array[0]=var1

arrya[1]=var2

...

array[n]=varN

计算数组元素个数:${#array[@]} 或者 ${#array[*]}

BASH的特殊参数 @ 和 * 都表示“扩展位置参数,从1开始”,但形式稍有差异,但在数组里使用好像是可以通用的。

输出数组所有元素:echo ${array[@]} 或者 ${array[*]}

引用数组元素:echo ${array[n]}

清除指定的单个数组元素:unset array[n]

清除整个数组:unset array

遍历数组:

filename=(`ls`)

for var in ${filename[@]};do

echo $var

done

数组实用示例:

1、将字符串里的字母逐个放入数组,并输出到“标准输出”

chars='abcdefghijklmnopqrstuvwxyz'

for (( i=0; i<26; i++ )) ; do

array[$i]=${chars:$i:1}

echo ${array[$i]}

done

${chars:$i:1},表示从chars字符串的 $i 位置开始,获取 1 个字符类似awk下的substring函数

2、如何用变量来替换数组名?下面例子为获取flag值对应的cdntype(cdn01中的元素,cdntype=1 ...cdn05中的元素 cdntype=5)

cdn01=("koram" "batheo" "batheoeu" "jpas" "asth" )

cdn02=("askr")

cdn03=("zsml")

cdn03=("wiyou")

cdn05=("zspt" "zsru" "zsfr" "zses" "de" "zsit")

for i in {1..5}

do

cdn="cdn0$i"

for num in $(eval echo \${$cdn[@]})//实现用变量来替换数组名,并且获取数组的所有元素

do

if [ $num == "$flag" ];then

cdntype=$i

break

fi

done

done

5:eval的作用是再次执行命令行处理,也就是说,对一个命令行,执行两次命令行处理。

一个极其简单的例子可以说明

151438922.jpg

(详情可参照该链接http://www.cnblogs.com/huzhiwei/archive/2012/03/14/2395956.html

6:grep 比较2个文件差异

grep -vwf file1 file2 (file2中存在file1中不存在的)

grep -wf file1 file2(提取公共部分)

grep -vwf file1 file2 && -vwf file2 file1(提取文件不同部分)

原创粉丝点击