龙空技术网

一文带你回顾shell中的文本处理函数2

程序员日常摸鱼 131

前言:

现时咱们对“c语言统计一行文本的单词个数”可能比较关注,我们都需要剖析一些“c语言统计一行文本的单词个数”的相关知识。那么小编同时在网络上搜集了一些对于“c语言统计一行文本的单词个数””的相关资讯,希望兄弟们能喜欢,大家快快来了解一下吧!

sed 对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容

语法 sed options scripts file

option -e 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用

-f 用指定的脚本文件来处理输入的文本文件-

-n、--quiet表示仅显示处理后的结果,禁止sed编辑器输出,但可以与p命令一起使用完成输出

-i 直接修改目标文本文件

-r 使用扩展正则表达式

常用命令

a:追加 向匹配行后面插入内容

c:更改 更改匹配行的内容

i:插入 向匹配行前插入内容

d:删除 删除匹配的内容

s:替换 替换掉匹配的内容

p:打印 打印出匹配的内容,通常与-n选项和用

=:用来打印被匹配的行的行号

n:读取下一行,遇到n时会自动跳入下一行

r,w:读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件

sed -e 4a\newLine testfile #testfile文件的第四行后添加一行,并将结果输出到标准输出

sed '2,5d' testfile #删除第 2~5 行

sed '3,$d' testfile #删除第 3 到最后一行

sed '2a drink tea' testfile #在第二行后(即加在第三行) 加上drink tea 字样:

sed '2i drink tea' testfile #第二行前加上drink tea

sed '2a Drink tea or \

drink beer ?' testfile #增加两行以上

sed '2,5c No 2-5 number' testfile #第 2-5 行的内容取代成为 No 2-5 number

sed -n '5,7p' testfile #仅列出 testfile 文件内的第 5-7 行

sed -n '/oo/p' testfile #搜索 testfile 有 oo 关键字的行

sed '/oo/d' testfile # 删除 testfile 所有包含 oo 的行,其他行输出

sed -n '/oo/{s/oo/kk/;p;q}' testfile # 搜索 testfile,找到 oo 对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 oo 替换为 kk

sed -e 's/oo/kk/g' testfile #将 testfile 文件中每行第一次出现的 oo 用字符串 kk 替换,然后将该文件内容输出到标准输出:

sed -i 's/oo/kk/g' testfile #选项 i 使 sed 修改文件:

sed -i 's/oo/kk/g' ./test* #批量操作当前目录下以 test 开头的文件

sed -e '3,$d' -e 's/HELLO/RUNOOB/' testfile #删除 testfile 第三行到末尾的数据,并把 HELLO 替换为 RUNOOB

sed -i '$a # This is a test' regular_express.txt #在 regular_express.txt 最后一行加入 # This is a test:

awk 可编程的文件提取器和文件格式化工具, 处理或提取特定域(特定列)具有非常好的表现

语法 awk [options 可选参数] pattern(模式) {action(动作)} file(文件)

参数

-F 指定分割字段符

-V 定义或修改一个awk内部的变量

-f 从脚本文件中读取awk命令

内置变量

$n 指定分隔符后,当前记录的第n个字段(列)

$0 完整的输入记录

FS 输入字段分割符,默认是空格

OFS 输出字段分隔符,默认是空格

RS 输入记录分隔符(输入换行符),指定输入时的换行符

ORS 输出记录分隔符(输出换行符),输出时用指定符号代替换行符

NF(Number of fields:字段数) 分割后,当前行一共有多少个字段

NR(Number of records:记录数) 当前记录数,行数

FNR 各文件分别计数的行号

FILENAME 当前文件名

ARGC ARGC:命令行参数的个数

ARGV ARGV:数组,保存的命令行所给定的各参数

awk "NR==5" pwd.txt #显示文件第五行

awk "NR==2,NR==5" pwd.txt #显示文件2到5行

awk 'NR==3,NR==5{print NR,$0}' pwd.txt #显示3到5行并显示行号

awk -F ":" '{print NR,$1,$(NF-1),$NF}' pwd.txt # 显示第一行 倒数第二行最后一行

awk格式化输出

printf 和print的区别

format(格式)的使用

其与print的最大不同是,printf需要指定format

format用于指定后面的每个item(项目)的输出格式

printf语句不会自动打印换行符:\n

format格式的指示符都是以%开头,后跟一个字符如下

%c :显示字符的ASCII码

%d,%i :十进制整数

%e,%E :科学计数法显示数值

%f :显示浮点数

%g,%G :以科学计数法的格式或浮点数的格式显示数值

%s :显示字符串

%u :无符号整数

%% :显示自身

printf修饰符

-:左对齐,默认右对齐

+:显示数值符号

awk -F ":" 'BEGIN{printf "%-25s\t%-25s\t%-25s\t%-25s\t\n","用户名","用户ID","用户家目录","用户解释器"}{printf "%-25s\t%-25s\t%-25s\t%-25s\t\n",$1,$3,$6,$7}' pwd.txt

awk的模式

BEGIN 就是处理文本前,先执行BEGIN模式指定的动作

END 就是处理完所有文本之后,需要执行的动作

awk控制语句

if(判断条件){满足条件执行的语句} [else {不满足条件执行语句}

if(判断条件1){满足条件1执行语句}else if (判断条件2{满足条件2时执行语句}else{}

{while (判断条件){循环语句}},条件为真时,开始执行循环

do{循环语句}while(判断条件)

for(变量;判断;变量自增){循环语句}

break:直接跳出循环

continue:退出这次循环,进入下次循环

awk数组

awk中的数组只有关联数组

1.可以使用任意字符串,字符串要使用双引号括起来

2.如果某数组元素实现不存在,在引用时,awk会自动创建次元素,并将其值初始化为空字符串

awk内置函数

length():返回指定字符串的长度

rand():返回0和1之间的随机数,也就是小数在使用rand()函数时,在前面必须指定种子srand()

int()也是函数,它的作用是取整数,当前命令会随机取10以内的整数

sub(r,s,[t]):对t字符串进行搜索r表示模式匹配的内容,并将第一个匹配的内容替换为s

gsub(r,s,[t]):对匹配的字符全局替换

split(s,array,[r]):以r为分隔符,切割字符串s,并且将切割后的结果保存到array的数组中,第一个索引值为1

awk自定义函数,脚本调用

function name (虚变量1,虚变量2){

处理动作

处理动作

}

awk程序也可以写成脚本,然后当程序需要是,可以直接调用执行,awk脚本也是需要执行权限,所以在执行之前需要个执行权限

#!/bin/awk -f

function biji (x,y){

if(x>y){ max="x>y"}

else if (x==y){max="x=y"}

else{ max="x<y" }

return max

}

BEGIN{print biji(a,b)}

awk -v a=7 -v b=6 -f test.awk #x>y

wc 统计文件或I/O流中的"单词数量"

-w 统计单词数量

-l 统计行数量

-c 统计字节数量

-m 统计字符数量

-L 给出文件中最长行的长度

tr 字符转换过滤器

必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出现在tr命令序列中的特殊字符

tr [- cdst ][-- help ][-- version ][Set1][Set2]

-c, --complement:反选设定字符。用于字符补集替换,用SET2替换SET1中不包含的字符

-d, --delete:删除指令字符,删除SET1指定的所有字符

-s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符,用SET1指定的字符来替换对应的重复字符

-t, --truncate-set1:将SET1中字符用SET2对应位置的字符进行替换,一般缺省为-t

字符集合的范围

\NNN 八进制值的字符 NNN (1 to 3 为八进制值的字符)

\ 反斜杠

\a Ctrl-G 铃声

\b Ctrl-H 退格符

\f Ctrl-L 走行换页

\n Ctrl-J 新行

\r Ctrl-M 回车

\t Ctrl-I tab键

\v Ctrl-X 水平制表符

CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。

[CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止

[CHAR*REPEAT] :这也是 SET2专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)

[:alnum:] :所有字母字符与数字

[:alpha:] :所有字母字符

[:blank:] :所有水平空格

[:cntrl:] :所有控制字符

[:digit:] :所有数字

[:graph:] :所有可打印的字符(不包含空格符)

[:lower:] :所有小写字母

[:print:] :所有可打印的字符(包含空格符)

[:punct:] :所有标点字符

[:space:] :所有水平与垂直空格符

[:upper:] :所有大写字母

[:xdigit:] :所有 16 进位制的数字

[=CHAR=] :所有符合指定的字符(等号里的 CHAR,代表你可自订的字符)

-s 替换重复的字符

# 将连续重复的多个字符替换为单个字符,SET1指定了字符串要被操作的字符

echo "aaabbbaacccfddd" | tr -s [abcdf] // 输出 abacfd

# 删除空白行

tr -s ["\n"]

-d 删除字符

# 删除字符串中所有字母

echo "a12HJ13fdaADff" | tr -d "[a-z][A-Z]" //输出 1213

# 删除字符串中所有匹配SET1集合中的字符

echo "a1213fdasf" | tr -d [adfs] // 输出 1213

# 删除文件FileName中的数字、点、空格、横杠

cat FileName | tr -d "[0-9][.][\-][ ]"

-t 字符替换,一般缺省为-t,SET1和SET2中字符一一对应

# 将文件FileName中的小写字母全部转换成大写字母:

cat FileName |tr a-z A-Z

cat FileName |tr -t a-z A-Z

cat FileName |tr [:lower:] [:upper:]

# 将字符串中的SET1字符用SET2中字符替换

echo "a1213fdasf" | tr -t [afd] [AFO] // 输出 A1213FOAsF

-c 字符补集替换

# 文件FileName

Python 2015.9 - 2018.11

Linux 2016.4 - 2018.11

C 2013.9 - 2014.9

Golang 2018.11 -

# 删除文件FileName中的除字母以外的字符

cat FileName | tr -cs "[a-z][A-Z]" "\n"

cat FileName | tr -c "[a-z][A-Z]" "#" | tr -s "#" | tr -t "#" "\n"

// 输出

Python

Linux

C

Golang

标签: #c语言统计一行文本的单词个数