我现在正在尝试学习 awk,我想做一项特定的任务。我的问题与之前发布的问题范围相似(使用 awk 将列转置为行 https://stackoverflow.com/questions/13634816/using-awk-to-transpose-column-to-row),但对我的数据不太适用。我一直在试图找出原因,我确信它很简单。
我在制表符分隔的表中有大量数据,只有两个字段(下面的示例):
1101\t7778
1101\t7755
1101\t8889
1101\t6789
2300\t1220
4000\t2333
4000\t7555
4000\t9000
4000\t1111
我想在字段匹配时将第二个字段附加到一行上。期望的输出是:
1101\t7778\t7755\t8889\t6789
2300\t1220
4000\t2333\t7555\t9000\t1111
如果可能的话,我想获得命令中所有部分的解释,以便我将来能够理解它。提前致谢。
awk ' { list[$1] = list[$1] "\t" $2 }
END { for (i in list) printf "%s%s\n", i, list[i] }' data
第一行添加一个选项卡,第二个字段添加到list
索引为的元素$1
。第二行打印出键和累积的值列表。
示例输出:
1101 7778 7755 8889 6789
4000 2333 7555 9000 1111
2300 1220
如果你想对第一列进行排序,你可以通过管道输出sort -n
。如果你有 GNUawk
,您也可以研究内置排序函数:
/usr/gnu/bin/awk ' { list[$1] = list[$1] "\t" $2 }
END { n = asorti(list, indexes);
for (i = 1; i <= n; i++)
printf "%s%s\n", indexes[i], list[indexes[i]]
}' data
排序输出:
1101 7778 7755 8889 6789
2300 1220
4000 2333 7555 9000 1111
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)