如何在使用parallel --link时用空值填充不足的参数?
问题描述
我执行了以下命令:
parallel --link echo ::: A B C ::: 1 2 3 4 5 ::: X O
当前输出结果为:
| A | 1 | X | | B | 2 | O | | C | 3 | X | | A | 4 | O | | B | 5 | X |
但我期望得到如下结果:
| A | 1 | X | | B | 2 | O | | C | 3 | | | | 4 | | | | 5 | |
请问是否可以实现该效果?
实现方案
可以实现,核心是让短序列耗尽后输出空值而非循环复用,以下是几种可行方法:
方法一:借助awk补全缺失列
先通过parallel --keep-order保证输出顺序,再用awk为短序列耗尽后的行补全空值:
parallel --link --keep-order echo ::: A B C ::: 1 2 3 4 5 ::: X O | awk -v total_cols=3 '{ for (i=NF+1; i<=total_cols; i++) $i=" "; printf "| %s | %s | %s |\n", $1, $2, $3 }'
方法二:手动补全短序列空值
提前给长度不足的序列补充对应数量的空字符串,让所有序列长度一致:
parallel --link echo ::: A B C "" "" ::: 1 2 3 4 5 ::: X O "" "" ""
此方法适合序列长度固定的场景,需要提前计算短序列需补充的空值数量。
方法三:结合--xapply与awk处理
用--xapply让短序列到末尾后停止输出对应列,再用awk补全后续行的空列:
parallel --xapply echo ::: A B C ::: 1 2 3 4 5 ::: X O | awk '{ while (NF < 3) $NF=$NF" "; printf "| %s | %s | %s |\n", $1, $2, $3 }'
以上任一方法都能生成你期望的输出格式。
内容的提问来源于stack exchange,提问作者Brian Holsen
相关产品推荐
相关产品推荐

