力扣仅有的几道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