我正在尝试学习awk,我想做一个特定的任务.我的问题与之前发布的问题类似(使用awk将列转换为行),但对我的数据不太适用.我一直试图弄清楚为什么,我确定它很简单.
我在制表符分隔表中有大量数据,只有两个字段(如下所示):
1101\t7778
1101\t7755
1101\t8889
1101\t6789
2300\t1220
4000\t2333
4000\t7555
4000\t9000
4000\t1111
Run Code Online (Sandbox Code Playgroud)
当字段匹配时,我想最终将第二个字段附加到行上.期望的输出是:
1101\t7778\t7755\t8889\t6789
2300\t1220
4000\t2333\t7555\t9000\t1111
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我喜欢对命令中的所有部分进行解释,以便我将来能够理解它.提前致谢.
awk ' { list[$1] = list[$1] "\t" $2 }
END { for (i in list) printf "%s%s\n", i, list[i] }' data
Run Code Online (Sandbox Code Playgroud)
第一行将标签和第二个字段添加到list索引的元素$1.第二行打印出键和累积的值列表.
样本输出:
1101 7778 7755 8889 6789
4000 2333 7555 9000 1111
2300 1220
Run Code Online (Sandbox Code Playgroud)
如果要对第一列进行排序,则可以通过管道输出sort -n.如果你有GNU awk,你也可以调查内置的排序函数:
/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
Run Code Online (Sandbox Code Playgroud)
排序输出:
1101 7778 7755 8889 6789
2300 1220
4000 2333 7555 9000 1111
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4598 次 |
| 最近记录: |