如何将两个命令提取的单列结果对应合并为带分隔符的文件?
如何将两个命令提取的单列结果对应合并为带分隔符的文件?
嘿,这个需求用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不支持进程替换,或者觉得上面的命令太长不好理解,可以分两步来:
- 把两个命令的结果分别存到临时文件:
# 提取第一列内容到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
- 用
paste合并两个文件,指定分隔符:
paste -d ' | ' file1.txt file2.txt > output.txt
- 用完临时文件可以删掉:
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
相关产品推荐
相关产品推荐

