使用awk实现文件合并及自定义字段位置的技术问询
需求1:将file1字段插入file0的Uplinks与Portgroups之间
假设file0与file1的行数一一对应,可通过以下awk脚本实现插入逻辑:
# 先读取file1的所有行存入数组 NR == FNR { arr[NR] = $0 next } # 处理file0的每一行 { line = "" for (i=1; i<=NF; i++) { line = line $i " " # 匹配到Uplinks开头的字段后,插入file1对应行的内容 if ($i ~ /^Uplinks:/) { line = line arr[FNR] " " } } # 去除末尾多余空格后输出 sub(/ $/, "", line) print line }
执行命令:
awk -f insert.awk file1.txt file0.txt
说明
- 若
Uplinks的匹配规则需要调整(比如字段不是以Uplinks:开头,而是包含Uplinks关键词),可修改$i ~ /^Uplinks:/为$i ~ /Uplinks/。 - 若文件使用非空格分隔符(如逗号、冒号),需调整
NF的遍历逻辑,或通过split()函数拆分每行内容后处理。
需求2:关联vSwitch与多vmnic的网卡记录
假设file2的格式为vSwitch名称:vmnic1,vmnic2,...,file1的每条记录以vmnic作为第一个字段,可通过以下awk脚本实现关联:
# 先读取file2,构建vmnic到vSwitch的映射数组 NR == FNR { # 拆分vSwitch和vmnic列表 split($0, vs_info, ":") vswitch = vs_info[1] split(vs_info[2], vmnic_list, ",") # 每个vmnic对应到所属vSwitch for (idx in vmnic_list) { vmnic_map[vmnic_list[idx]] = vswitch } next } # 处理file1的网卡记录,输出关联后的内容 { # 假设输出格式为「vSwitch名称 vmnic 网卡信息」,可按需调整printf格式 printf "%-10s %-8s %s\n", vmnic_map[$1], $1, substr($0, index($0, $2)) }
执行命令:
awk -f map.awk file2.txt file1.txt
说明
- 若file2或file1的格式有变化,可修改
split()的分隔符参数,或调整字段提取逻辑。 - 输出格式可通过修改
printf的占位符和内容自由定制,比如改为逗号分隔的CSV格式:printf "%s,%s,%s\n", vmnic_map[$1], $1, substr($0, index($0, $2))。
内容的提问来源于stack exchange,提问作者hyun.ji
相关产品推荐
相关产品推荐

