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

如何将两个命令提取的单列结果对应合并为带分隔符的文件?

如何将两个命令提取的单列结果对应合并为带分隔符的文件?

嘿,这个需求用paste命令就能轻松搞定,它本来就是专门用来按行合并多个输入的工具,比自己写脚本简单多了!下面给你两种实用的方法:

方法一:无临时文件,直接进程替换(推荐)

如果你用的是bash/zsh这类支持进程替换的shell,可以直接把两个命令的输出作为paste的输入,一步到位生成目标文件:

paste -d '|' <(cat 1.log | cut -d: -f 9 | sort | uniq) <(cat 1.log | cut -d: -f 6 | cut -d " " -f2 | sort | uniq) | sed 's/|/ | /' > output.txt

解释一下:

  • <(command)是进程替换语法,它会把命令的输出当作一个临时的“虚拟文件”传给paste
  • -d '|'指定paste用|作为列分隔符
  • 最后用sed把|改成|(前后加空格),让格式更符合你的要求
  • 重定向到output.txt就是最终的目标文件啦

方法二:先存临时文件,再合并

如果你的shell不支持进程替换,或者觉得上面的命令太长不好理解,可以分两步来:

  1. 把两个命令的结果分别存到临时文件:
# 提取第一列内容到file1.txt
cat 1.log | cut -d: -f 9 | sort | uniq > file1.txt
# 提取第二列内容到file2.txt
cat 1.log | cut -d: -f 6 | cut -d " " -f2 | sort | uniq > file2.txt
  1. 用paste合并两个文件,指定分隔符:
paste -d ' | ' file1.txt file2.txt > output.txt
  1. 用完临时文件可以删掉:
rm file1.txt file2.txt

重要注意事项

一定要确保两个命令输出的行数完全一致!如果一个输出3行,另一个输出4行,paste会把多出来的行直接补在后面,比如第四行就会变成 | 多余的内容,不符合你的预期。你的例子里两个结果都是3行,所以没问题,但实际使用时要留意这点。

备选:用awk一次性处理(适合复杂场景)

如果以后需要更灵活的处理逻辑,比如在合并前做更多数据校验,也可以用awk来实现:

awk -F: '
    {
        # 提取并去重第一列(第9个冒号分隔字段)
        col9[$9]
        # 提取并去重第二列(第6个冒号字段里的第二个空格分隔部分)
        split($6, arr, " ")
        col6[arr[2]]
    }
    END {
        # 把去重后的内容转成有序列表(模拟sort)
        i=0
        for (val in col9) sorted9[++i] = val
        j=0
        for (val in col6) sorted6[++j] = val
        # 按行对应输出
        for (k=1; k<=i; k++) {
            print sorted9[k] " | " sorted6[k]
        }
    }
' 1.log | sort > output.txt

不过这种方法相对复杂,如果你只是单纯合并两行结果,还是paste更高效。

备注:内容来源于stack exchange,提问作者ValeT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:08:20