假设您有一个包含IP地址的文件,每行包含一个地址:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
Run Code Online (Sandbox Code Playgroud)
您需要一个shell脚本,它为每个IP地址计算它在文件中出现的次数.对于先前的输入,您需要以下输出:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
Run Code Online (Sandbox Code Playgroud)
一种方法是:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
Run Code Online (Sandbox Code Playgroud)
然而,它真的远没有效率.
如何使用bash更有效地解决这个问题?
(有一点要补充:我知道它可以通过perl或awk解决,我对bash中的更好解决方案感兴趣,而不是那些语言.)
附加信息:
假设源文件为5GB,运行算法的机器为4GB.因此,排序不是一种有效的解决方案,也不是多次读取文件.
我喜欢类似哈希表的解决方案 - 任何人都可以对该解决方案进行改进吗?
附加信息#2:
有些人问为什么我会在bash中使用它时更加困难,例如perl.原因是在机器上我必须这样做perl不适合我.这是一个定制的linux机器,没有我习惯的大多数工具.我认为这是一个有趣的问题.
所以,请不要责怪这个问题,如果你不喜欢它就忽略它.:-)
我刚才有一个我无法回答的问题.
假设您在Java中使用此循环定义:
while (i == i) ;
Run Code Online (Sandbox Code Playgroud)
如果循环不是无限循环并且程序只使用一个线程i,i那么类型和值是什么?
与此问题类似......
您在Java代码中实际发现的最差实践是什么?
我的是:
我有一个大型应用程序(约50个模块)使用类似于以下的结构:
我想将应用程序导入Maven和Subversion.经过一些研究后,我发现存在两种实用的方法.
一个是使用树结构,就像前一个一样.这种结构的缺点是你需要大量的调整/黑客才能使多模块报告与Maven一起工作.另一个缺点是在Subversion中,标准的trunk/tags/branches方法为存储库增加了更多的复杂性.
另一种方法使用扁平结构,其中只有一个父项目,所有模块,子模块和子模块部分都是父项目的直接子项.这种方法适用于报告,并且在Subversion中更容易,但是我觉得我这样失去了一些结构.
从长远来看,你会选择哪种方式?为什么?
你会如何开始改进一个非常糟糕的系统?
在您建议创建单元测试和重构之前,让我解释一下我的意思.我可以使用这些技术但在这种情况下这将毫无意义.
实际上系统是如此破碎,它没有做它需要做的事情.
例如,系统应计算它发送的消息数量.它主要起作用,但在某些情况下它会"忘记"增加消息计数器的值.问题是,许多其他具有自己的变通方法的模块建立在这个计数器上,如果我纠正计数器,整个系统将变得比现在更糟.解决方案可能是修改所有模块并删除自己的更正,但是有150多个模块需要如此多的协调才能负担得起.
更糟糕的是,有些问题的解决方法不是在系统本身,而是在人们的头脑中.例如,系统不能在一个消息组中表示超过四个相关消息.某些服务需要将五个消息组合在一起.会计部门知道这种限制,每次他们计算这些服务的消息时,他们会计算消息组并将其乘以5/4以获得正确的消息数.绝对没有关于这些偏差的文档,没有人知道现在系统中存在多少这样的东西.
那么你将如何开始改进这个系统呢?你会采取什么策略?
还有一些额外的事情:我是一个单人军队,因此雇用足够的人并重新设计/重构系统是不可接受的答案.在几个星期或几个月内,我真的应该展示一些明显的进展,所以不能选择在几年内进行自我重构.
一些技术细节:系统是用Java和PHP编写的,但我认为这并不重要.它背后有两个数据库,一个是Oracle和一个PostgreSQL数据库.除了代码本身之前提到的缺陷之外,它的编写和记录也非常糟糕.
附加信息:
计数器问题不是同步问题.counter ++语句被添加到某些模块中,而不会添加到其他模块中.快速而肮脏的修复是将它们添加到缺失的位置.长期解决方案是使其成为需要它的模块的一个方面,以后不可能忘记它.我没有修复这样的问题,但是如果我做这个改变,我会打破其他10个模块.
更新:
我接受了Greg D的回答.即使我更喜欢Adam Bellaire,也不会让我知道什么是理想的.谢谢大家的答案.
是否有一种干净且独立于操作系统的方法来确定Perl的本地计算机的IP地址?
到目前为止,我找到了以下解决方案:
解析ifconfig和ipconfig的输出(硬盘,不同的windows版本有不同的ipconfig输出)
建立与知名IP的网络连接并检查套接字的本地IP地址(如果我无法建立连接并且只确定一个IP地址将无法工作)
还有更好的建议吗?
我有一个在5个应用服务器上运行的分布式Java应用程序 服务器都使用在第6台机器上运行的相同Oracle 9i数据库.
应用程序需要从序列中预取一批100个ID.在单线程,非分布式环境中相对容易,您可以发出以下查询:
select seq.nextval from dual;
alter sequence seq increment by 100;
select seq.nextval from dual;
Run Code Online (Sandbox Code Playgroud)
第一个选择获取应用程序可以使用的第一个序列ID,第二个选择返回可以使用的最后一个序列ID.
在多线程环境中,事情变得更加有趣.你不能确定在第二次选择之前另一个线程不会再次将序列增加100.这个问题可以通过同步Java端的访问来解决 - 你只让一个线程一次开始获取ID.
当您无法同步时情况变得非常困难,因为应用程序的某些部分不在同一个JVM上运行,即使在同一台物理机器上也不运行.我在论坛上发现了一些其他人在解决这个问题时遇到问题的参考资料,但没有一个答案真正起作用,更不用说合理了.
社区可以为这个问题提供解决方案吗?
更多信息:
在PostgreSQL上我可以做以下事情:
select setval('seq',nextval('seq')+ n - 1)
当你可以使用一个固定的增量值(在我的情况下这是完全可以接受的)时,马修的解决方案是有效的.但是,如果您不想修改增量的大小,但想要动态调整它,是否有解决方案?
我想限制可以上传到应用程序的文件的大小。为此,当要上传的文件大小超出限制时,我想从服务器端中止上传过程。
有没有一种方法可以在不等待HTTP请求完成的情况下从服务器端中止上载过程?
根据这个网站我可以简单地写
$user = getlogin();
Run Code Online (Sandbox Code Playgroud)
但是组处理函数似乎无法接受用户名/ userid作为参数.我是否应该遍历所有/ etc/group文件行并从中解析组名?
我有一种方法,周期性地(例如每10秒一次)尝试连接到服务器并从中读取一些数据.服务器可能不会一直可用.如果服务器不可用,则该方法抛出异常.
除非服务器至少在一分钟内不可用,否则实现不抛出异常的包装器方法的最佳方法是什么?