Linux的shell下常用编辑与处理命令实践
(一)利用 vi 创建文档,在当前光标前插入文本、在当前行之下新开一行;在命令模式下,分别利用 r、R 替换光标所在的字符。
首先采用vi建立空白文档:
vim viText.txt
采用i
:insert 在光标前插入,采用a
:append 在光标后追加文本,实践使用如下文本内容:
This is the text of vim
we can inset the code into the front of word by 'i'
以光标放置在第一行的单词vim
为例,在命令模式下,采用r
实现单个字符替换:
采用R
实现连续的字符替换:
(二)利用 vi 创建文档,输入若干行内容,输入命令以删除当前行及其后 n-1 行;删除光标开始处至行首;删除光标开始处至行尾。
将第一个内容的文本复制一个副本用于本题,并添加一定的新文本。
cp viText.txt viText2.txt
将光标置于第三行首,便于后续实践说明:
通过末行模式设置 set nu
或是在vimrc配置中设置显示行号,随后可以在命令模式下,采用d5G
命令删除本行到第5 (n-1) 行:
自往前删除直至第一行的命令为d1G
:
采用如下命令首先撤销前一次更改,再实现删除光标开始处至行首:
:undo
d0
同样的,可以采用命令: d$
实现删除光标所在处至行尾字符删除:
(三)利用 vi 创建文档,输入若干行内容,将当前行中所有字符串 “20191015”均用字符串“20201015”替代;从光标开始处向文件 尾搜索“Wuhan University” 。
继续复制已有的文档并采用vi
追加和编辑新副本文档。
cp vi*2* viText3.txt
编辑后的文档如下:
目标字符串既有单独存在的字,也有与其他字符混合拼接组成的一个字,可用于测试搜索查找功能的能力强弱:
末行模式下,全文本替换字符串::3s/20191015/20201015/g
替换前十行::1,10s/20191015/20201015/g
,可以发现第11行还是原样,达到了效果,同时底部显示了处理的行数等信息:
输入/ Wuhan University
查询:
字符连接在一起也可以查出:
(四)awk 脚本的基本结构是什么?awk 的工作原理是什么?试用一个 例子加以说明。
基本结构:
awk 'BEGIN{print "start"} pattern {print "Go Go Python"}END{print "End here"}'
工作原理:
例子:
采用不同复杂程度的awk脚本代码作说明,保存脚本文件名为 awktest.sh
:
echo | awk 'BEGIN{i=0}{i++} {print "Go Go Python"}END{print i}'
echo --------------
echo -e "line2\nline3\nline4" | awk 'BEGIN{print "Go first"} {print}END{print "END"}'
echo --------------round
echo -e 5,8 | awk '{
for(i=1;i<4;i++){
if($1<$2) {print "xiao"}
else{print "ilorge"}
}}'
echo -----------dictionary
awk 'BEGIN{
a["key1"]=23;a["key2"]=34;
for(i in a)
{print i,a[i]}}'
echo \n-----------Two dimission List
echo | awk 'BEGIN{
for(i=1;i<=9;i++){
for(j=1;j<=9;j++)
{tar[i,j] = i*j;
print(i,"*",j,"=",tar[i,j]);
}
}
采用 `sh awktest.sh` 直接执行(此方式不需要赋予文件更高的权限),可查看到运行的结果:
(五) 现有系列坐标(3,3)、(4,5) 、(7,8),需要将这些坐标进行平移,平移量为(1.5,3.5),请在终端采用 echo 和 awk 进行实现。
echo在终端打印点位坐标`echo -e "3 3\n4 5\n7 8"`:
使用awk脚本处理数据`echo -e "3 3\n4 5\n7 8" | awk '{print 1+1.5,2+3.5}'`:
(六)利用 awk 实现打印文本的奇数行和偶数行(提示:采用 NR%==0 和 NR%==1)
利用上文的副本文档`viText3.txt`用于本题测试。
6.1 查看数据
通过awk查看文件数据及其行号: `awk '{print NR,$0}' vi3`
6.2 奇偶行输出
根据行号 `NR` 分别输出奇偶行:
awk '{if(NR%2==0) print NR,0}' vi*3*
awk '{if(NR%2==1) print NR,0}' vi*3*
6.3 混合输出
`awk '{if(NR%2==1) {print NR,0} else{print "--", NR,0}}' vi3`
(七)设计一个综合利用 vi、awk 及 sed 命令的操作实验,并具体实现
7.1 原始数据文件
原始数据构建,采用vi编辑文档如下:
7.2 设计目标与要求
现有一个带有多种复杂分隔符的文档数据,请按如下要求实现:
(1)必须用到 vi 、awk、sed 命令;
(2)将分隔符规范化简介化,形式自定,还原数据并输出结果为副本文件便于后续数据处理;
(2)统计每一行的:第1列与第2列的和;第4、5、6列的和;各列的平均值、;任意列的最大值。
7.3 编写综合处理脚本
sed -e 's/]/ /g' composite.txt
(1)实验
cp composite.txt composite2.txt
sed -i 's#[##g' composite2.txt
echo 1
sed -i s/[//g composite2.txt
sed -i 's#]##g' composite2.txt
echo 2
sed -i "s/'//g" composite2.txt
echo 3
awk '{print NR,"-", 0 ,2}' composite2.txt
awk '{
sum1 = 0;
sum2 = 0;
sum3 = 0;
for(i=1;i<=NR;i++){
sum1 = sum1 + $1;
sum2 = sum2 + $2;
}
print(sum1,sum2,sum3)
}' composite2.txt
awk '{print "----------------end------------"}'
可以发现不够用。
(2)最终结果
1 cp composite.txt composite2.txt
2 echo "\n-------source data-----------\n"
3 awk '{print NR,NF," - ",0}' composite2.txt
4 sed -i 's/,/ /g' composite2.txt
5 sed -i 's/\[//g' composite2.txt
6 sed -i 's/]//g' composite2.txt
7 sed -i "s/'//g" composite2.txt
8 echo "\n------------data filtering-----------\n"
9 awk '{print NR,NF," - ",0}' composite2.txt
10 echo "\n-----------statistics-------------\n"
11 awk 'BEGIN{max = 0}{
12 print(NR,NF," - ",0," | ",2+3,4+5+6)
13 sum1 += 1;
14 sum2 +=2;
15 sum3 += 3;
16 sum3 +=4;
17 sum5 += 5;
18 sum6 +=6;
19 if(2>max){
20 max =2;
21 }
22
23 }'END'{print NR+1,NF," - ",$1+1,sum2/NR,sum3/NR,sum4/NR,sum5/NR,sum6/NR," | max values of column2:",max}' composite2.t xt
24
25
26 echo "----------------End------------"
27 echo "@ by GanAHE"
28 exit 1
采用vim composite2.txt命令查看处理后的副本文件效果如下:
总结
通过以上几题练习与实践,能够有效加深对Linux下shell脚本命令的认识,并且能够实现对一些现实应用场景需求的处理,比如数据清洗、数据统计等。
Comments | NOTHING