【发布时间】:2015-05-12 19:11:46
【问题描述】:
我想出了以下代码来在 passwd 文件中查找重复的 UID,但它不包括第一个实例(后来被复制的那个),我最终想要一个带有 UID = [ USER1, USER2 ] 的字典,但我是不知道如何在 Awk 中完成。
到目前为止我所拥有的:
awk -F':' '$1 !~ /^#/ && _[$3]++ {print}' /etc/passwd
解释(据我所知),如果正则表达式匹配不以注释“#”开头的行,则根据当前行 UID 值增加一个数组,使该行变为非零/真值,从而打印它.
【问题讨论】:
-
至少在扫描期间第一次看到它时,您无法区分将被复制的 UID 和不会复制的 UID。为此,您需要保存所有匹配的行并在最后打印出来。
-
使用这种类型的 awk 语句最节省内存的方法是什么?
-
我能想到的最好的办法是在处理过程中存储每个“第一”行,然后在
END处循环,并打印每个计数大于 1 的“第一”行。 -
不要使用名为
_的变量。您真的不能认为这样做会使您的代码以任何其他可能的方式更具可读性或更好。发布示例输入和预期输出,如果您希望最终输出看起来像UID = [ USER1, USER2 ],那么显示 THAT,而不是像当前脚本那样产生一些不必要的中间形式。 -
@EdMorton 如果我没有提供一些“中间”版本的解决方案,其他人会抱怨我没有表现出任何努力来解决这个问题,这似乎在这个社区。很遗憾,我无法取悦所有人。
标签: dictionary awk associative-array