我正在尝试在Bash shell中将awk命令的输出一次性传递给多个命令,根据我的经验,我提出了以下解决方案:
awk '$13 ~ /type/ {print $15}' filename.txt | (wc -l || sort -u)
我希望能够同时计算和排序awk命令的结果,我该如何实现? 即使使用&&命令也不起作用,它只执行第一个命令然后退出。 我想这是我对bash知识的不足造成的。
提前感谢。
awk '$13 ~ /type/ {print $15}' filename.txt | tee >(wc -l >&2) | sort -u
>&2
,但它会被传递给sort命令,并且很可能会被排到输出的顶部。注意:本文已根据进一步测试更正了描述。awk '$13 ~ /type/ {print $15;c++}END{print c} ' filename.txt | sort -u
wc
和sort
命令并行工作以提高性能,那么这里有一个相对简单的解决方案:output=$(awk '$13 ~ /type/ {print $15}' filename.txt; echo a)
printf "%s" "${output%a}" | sort -u
printf "%s" "${output%a}" | wc -l
关于额外的a
的复杂性是为了防止awk
命令在输入末尾打印一些空行,而$()
结构会将其剥离。您可以轻松选择sort
或wc
中哪个应该先出现。
/dev/fd
的系统的方法(其中包括相当近期的Linux,*BSD和Solaris)。与{{link1:Walter使用bash,ksh93和zsh中可用的更简单方法进行类似构造}}相似,wc
的输出和sort
的输出可能会交错在一起。{
awk '$13 ~ /type/ {print $15}' filename.txt |
tee /dev/fd3 |
wc -l
} 3>&1 1>&3 | sort -u
如果您需要处理不适合内存的中间输出,并且不想让两个命令的输出混合在一起,我认为在POSIX shell中没有简单的方法,但使用ksh或zsh协同进程应该是可行的。
awk '$13 ~ /type/ {print $15}' filename.txt > tempfile
wc -l < tempfile
sort -u < tempfile
rm tempfile
$(...)
的用途。此外,创建临时文件是一个非常棘手的问题:如果当前目录不可写怎么办?如果脚本的两个实例同时运行怎么办?等等。 - Gilles 'SO- stop being evil'