【发布时间】:2020-03-29 10:05:27
【问题描述】:
我的输入文件看起来像
Item1,200,a,four,five,six,seven,eight1,nine1
Item2,500,b,four,five,six,seven,eight2,nine2
Item3,900,c,four,five,six,seven,eight3,nine3
Item2,800,d,four,five,six,seven,eight4,nine4
Item1,,e,four,five,six,seven,eight5,nine5
基于第一列的唯一值,我想组合所有其他列的唯一值。 到目前为止我尝试的是:
awk -F, '{
a[$1]=a[$1]?a[$1]"_"$2:$2;
b[$1]=b[$1]?b[$1]"_"$3:$3;
c[$1]=c[$1]?c[$1]"_"$4:$4;
d[$1]=d[$1]?d[$1]"_"$5:$5;
e[$1]=e[$1]?e[$1]"_"$6:$6;
f[$1]=f[$1]?f[$1]"_"$7:$7;
g[$1]=g[$1]?g[$1]"_"$8:$8;
h[$1]=h[$1]?h[$1]"_"$9:$9;
}END{for (i in a)print i, a[i], b[i], c[i], d[i], e[i], f[i], g[i], h[i];}' OFS=, input.txt
上面的输出是:
Item3,900,c,four,five,six,seven,eight3,nine3
Item1,200_,a_e,four_four,five_five,six_six,seven_seven,eight1_eight5,nine1_nine5
Item2,500_800,b_d,four_four,five_five,six_six,seven_seven,eight2_eight4,nine2_nine4
但我期待的是:
Item3,900,c,four,five,six,seven,eight3,nine3
Item1,200,a_e,four,five,six,seven,eight1_eight5,nine1_nine5
Item2,500_800,b_d,four,five,six,seven,eight2_eight4,nine2_nine4
我正在寻求一些帮助:
- 如何在组合值时只取唯一值?
- 只要存在空白值,在组合时不应在末尾附加分隔符(在我上面的例子中为下划线)?
- 如何根据第 1 列的值对输出进行排序?
非常感谢您的帮助。
【问题讨论】:
-
当您说“唯一值”时 - 您是指给定 $1 的唯一值还是给定 $1 的给定字段的唯一值?例如,如果值“十”出现在 Item1 的 2 个不同字段中 - 它会在输出中出现两次还是只出现一次?
-
@EdMorton 对于给定的 1 美元的给定字段,它是唯一的。含义:对于每个唯一的 Item 值(即 col-1),连接每列下存在的唯一值
-
好的,谢谢澄清。连接唯一值的顺序是否重要?例如,如果
Item1行上的最后一个值输出是nine5_nine1而不是nine1_nine5,可以吗? -
@EdMorton 在 col-1 上排序就足够了。对于剩余的列,任何值的顺序都可以。