0%

将以下脚本保存为 split_csv.sh

然后执行 split_csv.sh data.csv 100

可以将 data.csv 按照每个文件 100 行数据,分割为多个小文件,命名格式为:

data_0000.csv
data_0001.csv
data_0002.csv
data_0003.csv
data_0004.csv
...

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

# split_csv.sh data.csv 10000

file_path=$1
line_number=$2

# /a/b.c.d => file_name: /a/b.c file_ext: .d
file_name=${file_path%.*}
file_ext="."${file_path##*.}

filter_cmd='sh -c "{ head -n1 '${file_path}'; cat; } > $FILE"'
echo $filter_cmd
tail -n +2 $file_path | split -d -l $line_number -a 4 --additional-suffix $file_ext --filter="$filter_cmd" - ${file_name}_

matplotlib 中 subplots 时,合并多个子图, 实现类似 Excel中 “合并单元格”的功能。

例如:创建一个 3 行 2 列的 figure,将最后一行合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plt

# 创建一个 3 行 2 列的 figure,将最后一行合并
fig, axes = plt.subplots(3, 2, constrained_layout=True)
# 删除画布中要合并位置的子图
for ax in axes[-1, :]:
ax.remove()
axes = axes[:-1]
# 添加大的子图,覆盖整行
gs = axes[0,0].get_gridspec()
axbig = fig.add_subplot(gs[-1, :])

# 添加说明文字
axes = axes.reshape(-1)
for idx,ax in enumerate(axes):
ax.text(0.5, 0.5, "ax%d" % (idx), va="center", ha="center")
axbig.text(0.5, 0.5, "ax big", va="center", ha="center")

效果:

Python 将词典扁平化,

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 原始数据
data = {
'a':1,
'b':{
'c1': 2,
'c2':{
'd2':{
'e':3,
'f':4
}
}
}
}

# 转换后
flat_data = {
'a': 1,
'b.c1': 2,
'b.c2.d2.e': 3,
'b.c2.d2.f': 4
}

主要思路是迭代,这里给出两种实现方法。

使用生成器 yield

1
2
3
4
5
6
7
8
9
10
def flatten(d):
def _flatten(d, prefix=None):
for k,v in d.items():
full_key = k if prefix is None else prefix + '.' + k
if isinstance(v, dict):
# yield from 可以逐个返回递归调用中的结果
yield from _flatten(v, full_key)
else:
yield full_key,v
return {k:v for k,v in _flatten(d)}

合并迭代返回值

1
2
3
4
5
6
7
8
9
10
11
def flatten(d, prefix=None):
items = {}
for k,v in d.items():
full_key = k if prefix is None else prefix + '.' + k
if isinstance(v, dict):
# 通过 dict 的 update 方法合并子递归返回内容
sub_items = flatten(v, full_key)
items.update(sub_items)
else:
items[full_key] = v
return items

持续更新..

整理记录常用 shell 代码段。

基础变量

1
2
3
4
5
6
7
8
# 获取当前脚本所在目录
SHELL_FOLDER=$(dirname $(readlink -f "$0"))

# 获取当前时间 20200123112233
DATETIME=$(date +%Y%m%d%H%M%S)
# 获取当前时间 2020-01-23 11:22:33
DATETIME=$(date +%Y-%m-%d %H:%M:%S)

语法示例

逻辑判断

1
2
3
4
5
6
7
8
# 判断文件夹是否存在
if [ -d /path/to/folder ]; then
# do somthing if the folder exists
fi
# 判断文件是否存在
if [ -f /path/to/file ]; then
# do somthing if the file exists
fi

循环

1
2
3
4
5
# for 循环 (需要bash执行,ubuntu 默认sh不支持此语法)
for ((i=0; i<N;i++));
do
# ...
done

自定义参数

1
2
3
4
5
6
# 取第N个参数,如果不存在,设置默认值
OUTPUTDIR=$1
if [ ! $OUTPUTDIR ]; then
OUTPUTDIR=/var/log/top_monitor/
fi

实用功能集锦

1
2
3
4
5
6
7
8
9
10
11
# 判断命令是否存在
function is_cmd_exist() {
return $(type $1 &>/dev/null)
}

# 删除N分钟之前的文件, 例如:6 小时 = 360分钟
find /your/path -type f -mmin +360 -delete

# top 导出文本格式
top -b -c -n 1 > /path/to/save