如何使用Shell实现指定分隔符内数值的两两转置并输出到自定义命名的新文件
用Shell实现数值两两转置并按指定规则生成文件
我来帮你搞定这个需求,用awk就能轻松实现——它在处理文本字段、批量生成文件这类场景里特别顺手。下面直接上解决方案,再一步步解释细节:
核心脚本实现(优先用最后一列作为文件名)
假设你的输入文件名为input.txt,可以创建一个transpose.awk脚本文件,内容如下:
BEGIN { FS = "," # 把逗号设为字段分隔符,方便拆分每行内容 } { # 提取引号内的数值列表:去掉首尾的双引号 num_list = $1 gsub(/^"|"$/, "", num_list) # 将数值列表拆分为数组,每个元素是单个数字 split(num_list, nums, ",") # 确定输出文件名:这里用每行最后一列的字符串(你要的理想方案) output_file = $NF # 先清空文件(如果文件已存在,避免追加旧内容) print "" > output_file # 两两遍历数组,步长设为2,生成两行一组的输出 for (i = 1; i <= length(nums); i += 2) { # 确保有下一个数字,避免奇数个数字时出现单独一行(可选处理) if (i + 1 <= length(nums)) { print nums[i], nums[i+1] >> output_file } else { # 如果是奇数个数字,这里选择单独输出最后一个,也可以注释掉忽略 print nums[i] >> output_file } } # 关闭文件句柄,避免打开过多文件导致报错 close(output_file) }
如何使用
在终端里运行以下命令即可:
awk -f transpose.awk input.txt
如果你不想单独创建脚本文件,也可以直接用一行命令:
awk 'BEGIN{FS=","} {num_list=$1; gsub(/^"|"$/,"",num_list); split(num_list,nums,","); output_file=$NF; print "" > output_file; for(i=1;i<=length(nums);i+=2) {if(i+1<=length(nums)) print nums[i],nums[i+1] >> output_file; else print nums[i] >> output_file}; close(output_file)}' input.txt
切换为用倒数第二列数字作为文件名
如果需要回到最初的需求(用每行倒数第二列的数字当文件名),只需要把脚本里的output_file = $NF改成output_file = $(NF-1)即可。
比如修改后处理你的示例输入,就会生成文件1、2、3,内容和你给出的期望效果完全一致。
效果验证
拿你提供的输入内容为例:
- 第一行处理后,文件
aine的内容:1 2 3 4 5 64 3 9 - 第二行处理后,文件
bb的内容:2 3 4 5 - 第三行处理后,文件
ff的内容:3 4 5 6 6 2
完全符合你的预期!
内容的提问来源于stack exchange,提问作者Suntory
相关产品推荐
相关产品推荐

