工作中遇到的数据很多都是按照字段进行组织的,分隔符通常是制表符\t
,如下所示:
seg_A seg_B seg_C
...
...
...
这种格式可以组织各种数据,比如日志文件,训练/测试数据,用户行为数据等,这些数据都是字符串的形式,并且按照每行一个样本,每列一个字段的形式进行储存。linux中有很多工具和命令处理此类数据非常方便,这里简单笔记下。
打印某一列
采用awk
可以做到。
cat your_file | awk '{print $1}' # 打印第一列
cat your_file | awk '{print $NF}' # 打印最后一列
查找字符串
采用sed
, grep
,大杀器awk
当然也可,不过没必要。
cat your_file | sed -n '/string_pattern/p'
cat your_file | grep "your_string"
cat your_file | grep -E "string_pattern"
新增一列
采用awk
, 假如原本的文件如:
# file: your_file
1 2 3
4 5 6
7 8 9
那么在最后一列添加上字符A
,可以用以下脚本
cat your_file | awk '
BEGIN{string="A"}
{
for(i=0; i<=NF; i++)
{
printf($i);
printf("\t");
}
printf("%s\n", a);
}'
其输出结果是:
1 2 3 A
4 5 6 A
7 8 9 A
我们发现awk
的可执行代码非常类似于C语言,并且awk是对每一行为单位进行处理的,这意味着以上的代码会对文件中的每一行进行相同的操作。
替换字符串
替代字符串这个操作可以由非常多的工具进行,比如sed
, tr
, 万能的awk
等。个人喜欢用sed
。
cat your_file | sed -n 's/old_string/new_string/p'
大小写字母转换
tr
命令适合用于字符串的转换,压缩和删除。
echo "AbC" | tr -t [A-Z] [a-z]
输出为abc
数据筛选
有时候需要对每一列的某些数值指标(离散的或者连续的)进行筛选,可以采用awk
轻松搞定。原数据如:
# file: your_file
data_a data_b 1.0
data_a data_b 0.5
data_a data_b 0.8
data_a data_b 0.3
那么挑选所有最后一列大于0.5的行,可以
cat your_file | awk '$3>0.5'
输出为:
data_a data_b 1.0
data_a data_b 0.8
也可以选择同时筛选多个条件,通过与(&&)或(||)非(!)连接起来
cat your_file | awk '$3>0.5 && $3<0.8'
cat your_file | awk '$3<0.5 || $3>0.8'
cat your_file | awk '$3!=0'