我正在尝试使用gawk 4.1.4计算文件的字段12中的不同值的数量,并且还计算每个值发生的次数。我有两个简短的课程,为第一个问题给出了不同的答案,我无法解释原因。
{if(a[$12]++==1){count++}} END {print count}
...给出435,176的结果,而
{a[$12]++} END {for (i in a){count++};print count}
...给出599,845的结果。
你能解释一下这种行为吗,告诉我哪个值是正确的?我在Windows(ezwinport)下运行,字段分隔符是tab。
答案 0 :(得分:2)
显然第二个一个似乎是正确的! 您已经存储了
count
,并且您不需要单独的变量
使用count
标识唯一事件的方式在两种情况下都是错误的,因为每个唯一实例都 跟踪。
使用数组本身的值。
导出count
{if(a[$12]++==1){count++}} END {print count}
是错误的,但事实是当$12
中的字段第二次被跟踪时,它的作用是使用后增量运算符 在count
变量中。因此,您在输出中看到的较小计数。
另一方面,
{a[$12]++} END {for (i in a){count++};print count}
几乎是正确的,但您不需要count
变量,您已将其存储为数组a
中值的一部分,并以唯一值{{1 }}。执行上述操作也与
$12
一个展示它的小例子,
{a[$12}++; next} END {for (i in a) print a[i]}
假设我担心cat file
1 2 3
1 2 3
1 2 1
1 1 1
2 3 1
3 4 1
中的唯一实例及其出现次数。做你的第一个例子,
$2
查看最后一列中打印的awk '{if(a[$2]++==1){count++}}END {for (i in a) print i,a[i],count}' file
1 1 1
2 3 1
3 1 1
4 1 1
的错误值,如果您可以仔细查看,该变量甚至不会跟踪每个实例的计数 ,而是所有人的公共变量实例
第二种方法,看似看起来不错,但打印count
为count
并不清楚哪个实例,假设多个实例及其数量可能会发生。正确的方法是做,
4
此处awk '{a[$2]++; next}END {for (i in a) print i,a[i]}' file
1 1
2 3
3 1
4 1
代替count
,而是保存第2列中每个唯一值的唯一计数出现次数。
答案 1 :(得分:2)
第一个是错的(逻辑上,不是语法上,谢谢你强调事实,@ GeorgeVasiliou),因为你需要在#!/bin/sh
# build for iOS / Mac
# changed by 10mitri
# original:
# http://stackoverflow.com/questions/3588904/how-to-link-third-party-libraries-like-fftw3-and-sndfile-to-an-iphone-project-in
# this is the folder where the libs will be generated
export OUTPUT_DIR=ios-libs
# Select toolchains folder
export XCODE_TOOLCHAINS=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain
#$(CURRENT_ARCH)
build_target()
{
PLATFORM=$1
ARCH=$2
SDK_VERSION=$3
CONFIGURE_HOST=$4
IOS_DEPLOYMENT_TARGET=$5
export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/$PLATFORM.platform/Developer/SDKs/$PLATFORM$SDK_VERSION.sdk
export CPPFLAGS="-I$SDKROOT/usr/include/"
export CFLAGS="$CPPFLAGS -arch $ARCH -isysroot $SDKROOT"
export LD=$XCODE_TOOLCHAINS/usr/bin/ld
export CXX="$XCODE_TOOLCHAINS/usr/bin/clang -arch $ARCH -fembed-bitcode"
export CC="$XCODE_TOOLCHAINS/usr/bin/clang -arch $ARCH -fembed-bitcode"
echo ---------------------------------------------------
echo ---------------------------------------------------
echo ---------------------------------------------------
echo -------------- BUILD TARGET
echo -------------- PLATFORM : $PLATFORM
echo -------------- ARCH : $ARCH
echo -------------- SDK_VERSION : $SDK_VERSION
echo -------------- HOST : $CONFIGURE_HOST
echo -------------- MIN iOS : $IOS_DEPLOYMENT_TARGET
echo -------------- SDK PATH : $SDKROOT
echo ---------------------------------------------------
echo ---------------------------------------------------
echo ---------------------------------------------------
sleep 3
make clean
./configure --host=$CONFIGURE_HOST
make -j4
mkdir $OUTPUT_DIR/$ARCH
# Copy the lib
cp .libs/libfftw3.a $OUTPUT_DIR/$ARCH/libfftw3.a
unset CPPFLAGS CFLAGS LD CXX CC
}
mkdir $OUTPUT_DIR
rm -rf $OUTPUT_DIR/*
# Copy the header file too, just for convenience
cp api/fftw3.h $OUTPUT_DIR/fftw3.h
build_target "iPhoneOS" "armv7" "10.2" "arm-apple-darwin" "9.0"
build_target "iPhoneOS" "armv7s" "10.2" "arm-apple-darwin" "9.0"
build_target "iPhoneOS" "arm64" "10.2" "arm-apple-darwin" "9.0"
build_target "iPhoneSimulator" "x86_64" "10.2" "x86_64-apple-darwin" "9.0"
build_target "iPhoneSimulator" "i386" "10.2" "i386-apple-darwin" "9.0"
#build_target "MacOSX" "x86_64" "10.12" "i386-apple-darwin" "10.10"
之前++
:==
:
++a[$1]==1
哦,是的,我的考试$ awk '{if(++a[$1]==1){count++}} END {print count}' foo
3
:
foo