Linux数据清洗常用命令与技巧(聚焦文本处理)
在Linux环境中,“extract”(提取)通常指从文本文件(如日志、CSV、表格数据)中提取所需信息并进行清洗(如过滤无效行、提取特定列、替换错误数据、去重等)。以下是结合grep、awk、sed、cut等核心命令的具体方法,覆盖数据清洗的常见场景:
使用cut命令可按指定分隔符提取文件的特定列,适用于CSV、TSV等结构化数据。
cut -d'分隔符' -f'列号' 文件名data.csv(逗号分隔)中提取第1列(姓名)和第3列(分数),输出到新文件:cut -d',' -f1,3 data.csv > cleaned_data.csv
cut可能无法准确识别,建议用awk(默认以空格/制表符分隔):awk '{print $1, $3}' data.txt > cleaned_data.txt
使用grep命令可筛选包含特定关键词或符合正则表达式的行,适用于日志、文本内容。
-i:忽略大小写(如grep -i "error"匹配"Error"/“ERROR”);-v:反向过滤(如grep -v "debug"排除包含"debug"的行);-n:显示行号(便于定位);-c:统计匹配行数(如grep -c "success" log.txt)。access.log中提取包含"404"(页面未找到)的行,并显示行号:grep -n "404" access.log > error_lines.log
awk支持基于列值的条件判断,可实现更复杂的数据筛选(如数值比较、字符串匹配)。
awk '条件 {操作}' 文件名grades.txt(格式:姓名 分数)中提取分数大于80的学生信息:awk '$2 > 80 {print $1, $2}' grades.txt > high_scores.txt
awk '$2 > 80 && $3 == "Male" {print $1, $2, $3}' student_data.txt
awk可对列进行数学运算(如求和、平均值)或格式化输出(如调整分隔符)。
sales.txt(格式:产品 销售额)中每行的销售额占总销售额的比例:awk '{sum += $2; print $1, $2, $2/sum*100 "%"}' sales.txt
data.csv中的逗号分隔符替换为制表符(适用于后续用cut处理):awk -F',' '{OFS="\t"; print $1, $2, $3}' data.csv > tab_separated.txt
使用uniq命令可删除相邻的重复行(需先排序,因为uniq仅处理相邻行)。
-c:统计每行出现的次数(如uniq -c data.txt);-u:仅输出无重复的行(如uniq -u data.txt)。usernames.txt去重并保存:sort usernames.txt | uniq > unique_usernames.txt
使用sort命令可按字母、数值或自定义字段排序,常与uniq配合使用。
-n:按数值排序(如sort -n scores.txt);-r:反向排序(如sort -nr scores.txt);-t:指定分隔符(如sort -t',' -k2 data.csv按第2列排序);-u:去除重复行(等同于sort file.txt | uniq)。log.txt中的第3列(时间戳)升序排序:sort -t',' -k3 data.csv > sorted_data.csv
使用sed命令可批量替换文本中的字符或字符串,适用于修正数据格式(如日期、路径)。
sed 's/原字符串/新字符串/[选项]' 文件名g:全局替换(替换每行所有匹配项,默认仅替换第一个);-i:直接修改原文件(如sed -i 's/old/new/g' file.txt)。dates.txt中的斜杠/替换为短横线-(修正日期格式):sed 's/\//-/g' dates.txt > formatted_dates.txt
使用tr命令可删除或压缩连续重复的字符,适用于清理多余符号(如空格、换行符)。
-d:删除指定字符(如tr -d ','删除所有逗号);-s:压缩连续重复的字符(如tr -s ' '将多个空格压缩为一个)。log.txt中的所有空格:tr -d ' ' < log.txt > cleaned_log.txt
将常用命令组合成Shell脚本,实现一键数据清洗(如每日日志处理)。
app.log中分数大于90的行,去重后保存到high_scores_daily.txt:#!/bin/bash
input_file="app.log"
output_file="high_scores_daily.txt"
awk '$2 > 90 {print $1, $2}' "$input_file" | sort | uniq > "$output_file"
echo "数据清洗完成,结果保存到 $output_file"
对于大型文件(如GB级日志),可使用parallel工具并行处理,缩短处理时间。
parallel并行提取large_log.log中包含"error"的行(分成10个进程):cat large_log.log | parallel --will-cite 'grep "error" {} >> error_lines.tmp' ::: {1..10}
cat error_lines.tmp > cleaned_errors.log
rm error_lines.tmp
cp data.csv data_backup.csv),避免误操作导致数据丢失;,、TSV用\t),避免cut或awk提取错误;head查看部分结果(如awk '$2 > 80 {print $1, $2}' grades.txt | head),确保逻辑正确;awk(比grep+sed组合更高效),必要时用parallel加速。