力扣仅有的几道shell题
时隔一年多,再来做做力扣仅有的几道shell题,我也忘得差不多咋写了。
看完之后的感受:不只是差不多哦。
192. 统计词频
写一个 bash 脚本以统计一个文本文件 words.txt
中每个单词出现的频率。
为了简单起见,你可以假设:
words.txt
只包括小写字母和' '
。- 每个单词只由小写字母组成。
- 单词间由一个或多个空格字符分隔。
示例:
假设 words.txt
内容如下:
the day is sunny the the
the sunny is is
你的脚本应当输出(以词频降序排列):
the 4
is 3
sunny 2
day 1
说明:
- 不要担心词频相同的单词的排序问题,每个单词出现的频率都是唯一的。
- 你可以使用一行 Unix pipes 实现吗?
解答
# Read from the file words.txt and output the word frequency list to stdout.
awk '{for(i=1;i<=NF;i++) words[$i]+=1;};END{for(w in words) print w,words[w];}' words.txt | sort -rn -k2
# awk '{for(i=1;i<=NF;i++){asso_array[$i]++;}};END{for(w in asso_array){print w,asso_array[w];}}' words.txt | sort -rn -k2
# cat words.txt | xargs -n1 | sort | uniq -c | sort -rn | awk '{print $2,$1}'
193. 有效电话号码
给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个单行 bash 脚本输出所有有效的电话号码。
你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字)
你也可以假设每行前后没有多余的空格字符。
示例:
假设 file.txt 内容如下:
987-123-4567
123 456 7890
(123) 456-7890
你的脚本应当输出下列有效的电话号码:
987-123-4567
(123) 456-7890
解答
awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/' file.txt
grep -P '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$' file.txt
194. 转置文件
假设 file.txt
文件内容如下:
name age
alice 21
ryan 30
应当输出:
name alice ryan
age 21 30
解答
awk '
{
for(i=1;i<=NF;i++)
{
if(NR==1) result[i]=$i;
else result[i]=result[i]" "$i;
}
}
END {
for(i in result) print result[i];
# for(j=1;j<=NF;j++) print res[j]
}
' file.txt
195. 打印文件第十行
awk '{if(NR==10) print $0;}' file.txt
翻转:tac