前言

实验环境

  • 英文题面
  • Git 2.26.0 for Windows

195. Tenth Line

分类:Shell
难度:简单

1
2
3
4
5
awk '{if(NR==10) print $0}' file.txt

sed -n 10p file.txt

head -n 10 file.txt | tail -n +10

考虑不足 10 行的情况,输出最后一行

1
2
3
awk '{if(NR==10) print $0} END{if(NR<10) print $0}' file.txt

head -n 10 file.txt | tail -n -1

193. Valid Phone Numbers

分类:Shell
难度:简单

1
2
3
4
5
6
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
grep -P '^(\(\d{3}\) |\d{3}-)\d{3}-\d{4}$' file.txt

sed -n -r '/^(\([0-9]{3}\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}$/p' file.txt

192. Word Frequency

分类:Shell
难度:中等

1
2
3
cat words.txt | tr -s ' ' '\n' | awk '{words[$1]++;} END{for(k in words){print k,words[k];}}' | sort -nrk2

awk '{for(i=1;i<=NF;i++){words[$i]++}} END{for(w in words){print w,words[w]}}' words.txt | sort -nrk2

其他解法,这两行命令的区别在于分割单词,从执行时间的反馈来看使用 xargs 更慢一些。

1
2
3
cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -nr | awk '{print $2,$1}'

cat words.txt | xargs -n 1 | sort | uniq -c | sort -nr | awk '{print $2,$1}'

194. Transpose File

分类:Shell
难度:中等

awk 把数据读入为二维数组然后再转置输出,这种方法的时空效率都比较低。

1
awk '{for(i=1;i<=NF;i++){words[NR][i]=$i}} END{for(i=1;i<=NF;i++){for(j=1;j<=NR;j++){if(j==1){printf words[j][i]}else{printf " "words[j][i]}}printf "\n"}}' file.txt

用一维数组将每一列数据存为一项,每次输出一列数据(即转置后的一行)。

1
awk '{for(i=1;i<=NF;i++){if(NR==1){words[i]=$i}else{words[i]=words[i]" "$i}}} END{for(i=1;i<=NF;i++){print words[i]}}' file.txt
  • print:输出并换行
  • printf:输出不换行