常见的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();
        }
    }

}

01-01 07:26