我有这段代码,它可以很好地满足我的要求(来自@AdminBee 对“从 CSV 文件中打印重复值,包括出现次数”的回答,顺便说一句,谢谢!):
awk -F'|' '{c[$27]++} END{for (i in c) {if (c[i]>1) print c[i],i}}' input.csv
我需要将它放在一个单独的文件中(例如pk_check.awk
),然后能够从 zsh 内部调用它,但传递变量,例如分隔符、列号、文件名和扩展名,例如
separator=|
column_number=27
filename=input
extension=csv
echo | awk -v x=$separator -v y=$column_number -v w=$filename -v z=$extension -f pk_check.awk
(上面的代码不仅仅是一个想法,可能不正确或效率低下)
其背后的想法是,我可以(在将来)拥有更多足够通用的 awk“迷你测试”,以便从具有不同参数的 zsh 脚本中调用,甚至可以让 shell 脚本接收或处理不同文件的参数列表。
但在这一切之前,我必须先解决这个问题!:) 我尝试了一些丑陋的东西来发布在这里,我真的不太明白如何修改 .awk 文件以使其通用或如何从 shell 脚本调用它。
如果目的只是概括脚本并为其提供通用/干净的界面,我个人会在脚本周围包装一个 Zsh 函数,而不是弄乱它以使其接受常见参数,例如
separator
,filename
和extension
通过-v
;例外是column_number
,无论如何都必须通过-v
:用法:
例如:
您可以设计一种方法来使函数“接受键/值对”,例如
key=value
,但仍然利用位置参数(和关联数组);这是一种将命名参数传递给函数的非常粗糙和幼稚的方法,我确信它会在非平凡情况下中断,更不用说对于包装器来说可能有点过度了,我只是为了完整性而发布它:用法:
例如: