You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 03:39:06