使用awk和sed处理列格式及筛选数据的技术求助
解决方案
针对你的需求,直接用awk即可完成所有操作,无需sed。核心是通过正则匹配提取包含空格的字段,再完成拆分、分隔和筛选:
awk ' match($0, /^([^ ]+) +(.+?) +([^ ]+) +([0-9.]+) +([0-9.]+) +([0-9.]+)$/, arr) { # 拆分第一字段的前两位与剩余部分 prefix = substr(arr[1], 1, 2) rest = substr(arr[1], 3) # 计算最后三列的数值和 sum = arr[4] + arr[5] + arr[6] # 筛选和大于1500的行,用分号分隔所有列输出 if (sum > 1500) { printf "%s;%s;%s;%s;%s;%s;%s\n", prefix, rest, arr[2], arr[3], arr[4], arr[5], arr[6] } } ' Agenti.txt
命令说明
- 字段提取:用
match函数结合正则表达式,精准匹配每行的6个字段(其中第二字段包含空格),结果存入arr数组:arr[1]:原第一列(如05ALBUZZI)arr[2]:含空格的名字字段(如CLAUDIA MARIA)arr[3]:ID字段(如LBZCDM64M53F205R)arr[4]-arr[6]:最后三个数值列
- 拆分第一列:通过
substr截取arr[1]的前两位作为新的首列,剩余部分作为第二列 - 筛选逻辑:计算三个数值的和,仅输出和大于1500的行
- 分隔符替换:用
printf按分号分隔所有字段输出,确保含空格的字段不被拆分
为什么你的原有命令无效?
你之前使用FS="\t"是错误的——你的文件是空格分隔而非制表符分隔,且第二字段包含空格,默认的空格分隔规则会把CLAUDIA MARIA拆成两个字段,导致后续处理全部错位。
内容的提问来源于stack exchange,提问作者Flavio Costa
相关产品推荐
相关产品推荐

