linux高级原7

使用awk 进行高级文本处理

灵活性是awk最大的优势。

awk脚本的结构基本如下所示:
awk ' BEGIN{ print "start" } pattern { commands } END{ print "end" } 'file
awk命令也可以从stdin中读取。
awk脚本通常由3部分组成。BEGIN,END和带模式匹配选项的常见语句块。这3个部分都是可选项,在脚本中可省略任意部分。

以下awk脚本被包含在单引号或双引号之间:
awk 'BEGIN { statements } { statements } END { end statements }'
也可以使用:
awk "BEGIN { statements } { statements } END { end statements }"
例如:
$ awk 'BEGIN { i=0 } { i++ } END{ print i}' filename

或者
$ awk "BEGIN { i=0 } { i++ } END{ print i }" filename

awk命令的工作方式如下所注。
(1) 执行BEGIN { commands } 语句块中的语句。
(2) 从文件或stdin中读取一行,然后执行pattern { commands }。重复这个过程,直到
文件全部被读取完毕。
(3) 当读至输入流末尾时,执行END { commands } 语句块。
BEGIN语句块在awk开始从输入流中读取行之前被执行。这是一个可选的语句块,诸如变量
初始化、打印输出表格的表头等语句通常都可以写入BEGIN语句块中。
END语句块和BEGIN语句块类似。END语句块在awk从输入流中读取完所有的行之后即被执
行。像打印所有行的分析结果这类汇总信息,都是在END语句块中实现的常见任务(例如,在比
较过所有的行之后,打印出最大数)。它也是一个可选的语句块。
最重要的部分就是pattern语句块中的通用命令。这个语句块同样是可选的。如果不提供该语句块,则默认执行{ print },即打印所读取到的每一行。awk对于每一行,都会执行这个语句块。这就像一个用来读取行的while循环,在循环体中提供了相应的语句。
每读取一行,awk就会检查该行和提供的样式是否匹配。样式本身可以是正则表达式、条件语句以及行匹配范围等。如果当前行匹配该样式,则执行{ }中的语句。
样式是可选的。如果没有提供样式,那么awk就认为所有的行都是匹配的,并执行{ }中的语句。
让我们看看下面的例子:
$ echo -e "line1\nline2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" } '
Start
line1
line2
End
当使用不带参数的print时,它会打印出当前行。关于print,需要记住两件重要的事情:
当print的参数是以逗号进行分隔时,参数打印时则以空格作为定界符。在awk的print语句中,双引号是被当做拼接操作符(concatenation operator)使用的。

{ }类似于一个循环体,会对文件中的每一行进行迭代。

awk命令具有丰富的特性。要想洞悉awk编程的精妙之处,首先应该熟悉awk重要的选项和功
能。让我们来看看awk的一些重要功能。
1. 特殊变量
以下是可以用于awk的一些特殊变量。
 NR:表示记录数量,在执行过程中对应于当前行号。
 NF:表示字段数量,在执行过程中对应于当前行的字段数。
 $0:这个变量包含执行过程中当前行的文本内容。
 $1:这个变量包含第一个字段的文本内容。
 $2:这个变量包含第二个字段的文本内容。
例如:
$ echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | \

awk '{
print "Line no:"NR",No of fields:"NF, "$0="$0, "$1="$1,"$2="$2,"$3="$3
}'
Line no:1,No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
Line no:2,No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5
Line no:3,No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7


3. 用getline读取行
awk通常默认读取一个文件的所有行。如果只想读取某一行,可以使用getline函数。有时
候,我们需要从BEGIN语句块中读取第一行。
语法:getline var。变量var就包含了特定行的内容。如果调用不带参数的getline,我
们可以用 $0、$1和$2访问文本行的内容。
例如:
$ seq 5 | awk 'BEGIN { getline; print "Read ahead first line", $0 } { print $0 }'
Read ahead first line 1
2
3
4
5


4. 使用过滤模式对awk处理的行进行过滤
我们可以为需要处理的行指定一些条件,例如:
$ awk 'NR < 5' # 行号小于5的行
$ awk 'NR==1,NR==4' # 行号在1到5之间的行
$ awk '/linux/' # 包含样式linux的行(可以用正则表达式来指定模式)
$ awk '!/linux/' # 不包含包含模式为linux的行

5. 设置字段定界符
默认的字段定界符是空格。我们也可以用 -F "delimiter"明确指定一个定界符:
$ awk -F: '{ print $NF }' /etc/passwd
或者
awk 'BEGIN { FS=":" } { print $NF }' /etc/passwd

6. 从awk中读取命令输出
在下面的代码中,echo会生成一个空白行。变量cmdout包含命令grep root /etc/passwd
的输出,该命令会打印出包含root的行。
将命令的输出结果读入变量output的语法如下:
"command" | getline output ;
例如:
$ echo | awk '{ "grep root /etc/passwd" | getline cmdout ; print cmdout }'
root:x:0:0:root:/root:/bin/bash
通过使用getline,我们将外部shell命令的输出读入变量cmdout。


7. 在awk中使用循环
在awk中可以使用for循环,其格式如下:
for(i=0;i<10;i++) { print $i ; }
或者
for(i in array) { print array[i]; }
8. awk内建的字符串控制函数
awk有很多内建的字符串控制函数,让我们认识一下其中部分函数。
 length(string):返回字符串的长度。
 index(string, search_string):返回search_string在字符串中出现的位置。
 split(string, array, delimiter):用定界符生成一个字符串列表,并将该列表存
入数组。
 substr(string, start-position, end-position):在字符串中用字符起止偏移
量生成子串,并返回该子串。
 sub(regex, replacement_str, string):将正则表达式匹配到的第一处内容替换
成replacment_str。
 gsub(regex, replacment_str, string):和sub()类似。不过该函数会替换正则表
达式匹配到的所有内容。
 match(regex, string):检查正则表达式是否能够匹配字符串。如果能够匹配,返回
非0值;否则,返回0。match()有两个相关的特殊变量,分别是RSTART和RLENGTH。变量RSTART包含正则表达式所匹配内容的起始位置,而变量RLENGTH包含正则表达式所匹配内容的长度。



在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值