常见的shell
awk用法
# grades.txt 如下:
Alice 85
Bob 92
Charlie 78
Alice 90
Bob 88
# awk程序
{
name = $1
score = $2
sum[name] += score
count[name]++
}
END {
for (name in sum) {
avg = sum[name] / count[name]
printf "学生 %s 的平均分是 %.2f\n", name, avg
}
}
# 运行awk程序
awk -f calculate_avg.awk grades.txt
统计词频
写bash统计word.txt中每一个单词出现的频率
- 连续的字符进行压缩
-s = sequeeze
echo "Helloooooo, world!!!" | tr -s 'o'
# 变成
Hello world
# 将连续的空格转换成单个换行符
tr -s ' ' '\n'
# 结果
the
day
is
sunny
the
- 单词排序
sort
- 统计词频
uniq -c
-c
:在每列旁边显示该行重复出现的次数
wc -w
统计词频但是不显示原来的单词
- 排序单词出现的次数
sort -r
-r
逆序
- 打印
awk '{print $2, $1}':这里加上逗号
cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -r | awk '{print $2, $1}'
有效电话号码
^:表示开头位置
$:表示结尾位置
^\([0-9]{3}\) [0-9]{3}-[0-9]{4}
# xxx-xxx-xxxx
^[0-9]{3}-[0-9]{3}-[0-9]{4}
# 最终表达式
^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$
grep -P 正则表达式 file.txt
awk '/pattern/' file.txt
gawk
功能扩展:gawk提供了一些增强功能,如更强大的正则表达式支持、更丰富的内置函数、更强大的模式处理能力以及更灵活的输出控制。
正则表达式:gawk支持更丰富的正则表达式语法,包括零宽断言、非贪婪匹配、捕获组等。相比之下,传统的awk实现可能对一些高级正则表达式功能的支持较弱。
内置函数:gawk提供了一些额外的内置函数,如gensub()、strftime()等,用于字符串处理、日期时间操作等。
数组排序:gawk提供了asort()和asorti()函数,可以对数组进行排序。
多维数组:gawk支持多维数组,可以创建和操作更复杂的数据结构。
编程功能:gawk支持一些编程特性,如BEGIN和END模式、自定义函数等,使得编写复杂的awk脚本更加方便。
转置文件
-
wc -w
计算多个单词。类似uniq -c
-
xargs:多行变成一行
# 注意这里使用了三个引号包裹$i变量
awk '{print $'''$i'''}' | args
# 统计有多少列
c=${cat file.txt | head -1 | wc -w}
# 每一列进行转置
for i in $(seq 1 $c)
do
awk '{print $'''$i'''} | args'
done
因此,print $'''$i'''
的含义是打印第i
列的值。
请注意,这里使用了三个单引号'''
来包围$i
,这是因为在某些情况下,如果直接使用$i
,Shell会将其解析为Shell变量,而不是传递给awk命令。使用三个单引号可以防止Shell解析变量。
另外不要忘了使用cat读取文件
第十行
tail -n +10
:从第10行还是显示sed -n '10p' file.txt
awk {NR == 10} file.txt
:行计数器等于10的行
sed -n 's/Hello/Hi/p' file.txt
:将文件中的Hello替换成Hi
常见的多线程笔试题
常用的JUC工具包
- semaphore。生产者消费者模型中最常用的一个。交替问题
- futureTask: 搜索、线程池,任务思维
- CountDonwLatch
- lock
- synchornized
- volatile
常用的并发工具包
- concurrentHashMap:搜索问题
- BlockingList
单例模式
- 私有构造器
- 静态获取方法
- 锁本类。
package LeetReview;
/**
* @author: Zekun Fu
* @date: 2023/8/6 16:19
* @Description:
*
* 1. 静态内部类: 直接使用静态内部类holder
* 2. 懒汉式: 先判断是否有无,如果没有在new一个
* 3.饿汉式: 直接new 一个
* 4. 双锁检测
*/
public class Siglonten {
private static volatile Siglonten instance; // 为了防止使用未初始化的对象,这里加上volatile关键字,保证可见性
private Siglonten() {
System.out.println("创建单例!");
}
private static Siglonten getSiglote() {
if (instance == null) { // 第一次防止不必要的加锁
synchronized (Siglonten.class) { // 确保只有一个实例被创建
if (instance == null) {
instance = new Siglonten();
}
}
}
return instance;
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(()->{
Siglonten siglonten = Siglonten.getSiglote();
}).start();
}
}
}