2012-06-01 37 views
3

说有一个与分隔场标签的输入文件,第一场是整数awk如何将unix命令的结果作为参数?

1 abc 
1 def 
1 ghi 
1 lalala 
1 heyhey 
2 ahb 
2 bbh 
3 chch 
3 chchch 
3 oiohho 
3 nonon 
3 halal 
3 whatever 

首先,我需要计算的唯一值的计数的第一场,那将是:

5 for 1, 2 for 2, and 6 for 3 

然后我需要找到这些计数的最大值,在这种情况下,它的6

现在我需要通过“6”到另一个awk脚本作为parmeter。

我知道我可以使用下面的命令来获取计数的列表:

cut -f1 input.txt | sort | uniq -c | awk -F ' ' '{print $1}' | sort 

但我如何得到第一次开始计数,并把它传递给下一个awk命令的参数,而不是作为一个输入文件?

回答

3

这AWK脚本替换你的整个管道:

awk -v parameter="$(awk '{a[$1]++} END {for (i in a) {if (a[i] > max) {max = a[i]}}; print max}' inputfile)" '{print parameter}' otherfile 

其中'{print parameter}'是你的另一个AWK脚本替身和“otherfile”是该脚本的输入。

注:这是非常可能是两个AWK脚本可以合并成一个这将是比的方式做,如在你的问题概括少一个黑客(awk喂养awk )。

+0

非常感谢您的帮助! :)我喜欢你计算最大的方式。同意你的说法,有没有办法让我在一个awk脚本中编写一个函数,该脚本也称为awk?有一个伟大的星期天! :) – trillions

+0

@nanshi:你不应该需要awk中的所有awk,因为你已经在awk中了。有些技术用于处理多个文件,以各自的方式处理每个文件。如果您发布一个问题,询问如何处理一个脚本中的两部分,并显示这些部分如何交互,我或其他人会尝试回答。 –

+0

是的,我会为此发布另一个问题! :) – trillions

2

您可以使用shell的$()命令替换:

awk -f script -v num=$(cut -f1 input.txt | sort | uniq -c | awk -F ' ' '{print $1}' | sort | tail -1) < input_file 

(我加了tail -1确保最多使用一条线。)

+0

这样最后一个input_file是另一个awk脚本?另一个脚本如何将该值作为参数?说$(...)被评估为6,但在下一个awk(即脚本文件)中,它如何将6作为参数? – trillions

+0

非常感谢您的帮助!我想出了我的最后一个问题:)做一个awk param = $():) – trillions

+0

我的示例中的另一个'awk' script_存储在'script'中。如果你想把它全部放在命令行上,你可以。由于看起来你并不知道如何从'awk'访问变量,所以我决定进一步观察,发现使用'-v name = value'将变量'name'指定为特定执行时的价值。所以我编辑了我的答案以包含'-v num',只需从脚本中访问'num'变量即可。 – sarnold

5

这是什么很具体的awk的。

无论是程序可以从标准输入读取,那么你可以通过输入与管道:

prg1 | prg2 

或者您的程序需要输入作为参数,则使用

prg2 $(prg1) 

注意,在两种情况prg1都在prg2之前处理。

某些程序允许两种可能性,而大量数据很少作为参数传递。

+0

非常感谢您的帮助! – trillions

+0

+1,但在管道情况下,prg1在prg2之前*未处理。他们同时运行。当然prg2可能会阻塞读取并在prg1输出一些数据后开始运行,所以您几乎总是会说prg2在prg1看到它之后正在处理数据(但prg2可能忽略来自prg1的输出),但是整体管道的一点是你可以免费获得并发性。 –

+0

嗯,是的,这是不正确的,但是prg2将 - 如果它被构建为读输入 - 阻塞直到输入到达,并且如果prg1在产生最后一个输出后完成,它将产生所有输出,将它交给prg2,它可能足够快以至于在竞争条件下仍然在prg1之前完成,但是从生产者 - 消费者的角度来看,prg1将是生产者,prg2是消费者。在执行这两种程序时,不必将所有数据都保存在内存中,而不是平行调用的速度,这可能会更加有趣。 –