Leetcode刷题——shell专题(No.192-195)
192. 统计词频
提交记录
解1:
1 | # Read from the file words.txt and output the word frequency list to stdout. |
知识点
awk
分割出的每一行各字段分行打印
1 | awk '{for(a=1;a<=NF;a++) print $a}' words.txt |
注:awk
里的print
默认打印之后输出一个换行,若不换行用printf
。
统计文本文件中重复出现的行列
uniq
+sort
结合使用:
1 | sort test.txt | uniq -c |
注:-c原理是接下来的字符串相同则加一,如果不进行sort
排序的话将无法统计数目。
降序排列
1 | sort -r |
193. 有效电话号码
提交记录
解1:
1 | # Read from the file file.txt and output all valid phone numbers to stdout. |
解2:
1 | # Read from the file file.txt and output all valid phone numbers to stdout. |
解3:
1 | # Read from the file file.txt and output all valid phone numbers to stdout. |
知识点
正则表达式实现或运算
1 | (PatternA|PatternB) |
注意:如果是需要完全匹配PatternA或是完全匹配PattenB,则^
和$
在两个Pattern语句里都需要写,而不是写在括号外面。
参考:正则表达式实现与或非
正则表达式空格匹配
若要匹配任何空白字符,包括空格、制表符、换页符等等:\s
,等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。
若只需要匹配单个空格,直接输入空格即可:
正则表达式中的\d
在awk
里无法识别
改为[0-9]
sed
使用扩展类正则
必须加上参数-r
正则表达式学习参考
194. 转置文件
提交记录
解1(逻辑没问题,但是超出时间限制):
1 |
|
解2(利用awk
数组):
1 | # Read from the file file.txt and print its transposed content to stdout. |
解3(主要是xargs
跟这道题的格式绝配):
1 | # Read from the file file.txt and print its transposed content to stdout. |
知识点
echo
输出不换行
1 | echo -n '输出的内容' |
或
1 | echo -e '输出的内容\c' |
把shell变量传给awk
1 | awk -v var=value ... #value可以调用前面shell中定义的变量,用上$ |
注:一个-v
后接一个变量赋值,若要传多个变量值,需要接着用多个-v
。
awk
流程控制(if
和for
循环)
参考:linux shell awk 流程控制语句(if,for,while,do)详细介绍
awk
数组
注:awk
数组创建时的下标可以直接调用awk脚本里的变量作为索引,不用加引号变为字符串,读数组值时同理。
参考:linux awk 数组和循环、菜鸟教程:AWK 数组
awk
参考学习
xargs
:把多行打印到一行里
195. 第十行
提交记录
解1:
1 | # Read from the file file.txt and output the tenth line to stdout. |
解2:
1 | # Read from the file file.txt and output the tenth line to stdout. |
知识点
健全性
原题里的说明里有一句话:“如果文件少于十行,你应当输出什么?”,因此需要一个if
来判断文件行数是否少于10行
获取文件行数
1 | awk '{print NR}' file.txt | tail -n 1 |
把命令结果作为值赋给自定义变量(两种方式)
1 | #全程没有空格,变量名左边不用加$ |
虽然上述两种方式都可以在Shell脚本中得到命令运行的结果,但是有一点是不一样的,那就是反引号执行命令不支持嵌套,不能实现反引号中再出现反引号,而
$(command)
的方式是支持嵌套的。
参考:Shell脚本中获取命令运行结果、特殊变量使用、条件判断等常用操作
[ condition ]
打印出条件判断的结果
在终端里执行完[ condition ]
之后执行echo $?
,若打印出0则结果为true,打印出1则结果为false。
echo
不打印任何信息
1 | : #单个冒号,不执行任何操作,相当于终端里摁下enter键 |
参考:shell不打印
输出文件中的第10行
1 | sed -n '10p' file.txt |