如何使用awk命令交换文本文件指定列并输出目标格式内容
操作方案
你这个文本的行结构固定:前2列分别是数字ID、时间戳,最后2列分别是业务标识、角色,中间夹的所有字段就是需要移动到行尾的姓名,直接用awk按列重组即可。
实现命令
执行以下命令会将处理后的结果写入result.txt文件,不会修改原始文件:
awk '{ name = "" for(i=3; i<=NF-2; i++) { name = name " " $i } print $1, $2, $(NF-1), $NF, substr(name, 2) }' file.txt > result.txt
如果需要直接修改原文件,先输出到临时文件再覆盖即可,不要直接用重定向写入原文件,会导致原文件被清空:
awk '{ name = "" for(i=3; i<=NF-2; i++) { name = name " " $i } print $1, $2, $(NF-1), $NF, substr(name, 2) }' file.txt > tmp.txt && mv tmp.txt file.txt
命令逻辑说明
NF是awk内置变量,代表当前行按空格分隔后的总列数- 遍历第3列到倒数第3列的所有字段,拼接为完整的姓名字符串
- 按顺序输出ID、时间戳、倒数第二列(业务标识)、最后一列(角色)、拼接好的姓名,
substr(name,2)是为了去掉拼接时开头多出来的空格
注:你给出的样例目标中第7行
4846 202212:48:34+02:00 JR autotestbit Maintainer Walker Tom属于排版错位,按所有行的统一结构处理后,该行正确结果应为4846 202212:48:34+02:00 autotestbit Maintainer Walker Tom JR,和其余行的规则保持一致。
内容的提问来源于stack exchange,提问作者ggg
相关产品推荐
相关产品推荐

