gawk的行为我不明白

时间:2017-04-10 09:24:52

标签: awk gawk

我正在尝试使用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。

2 个答案:

答案 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 的错误值,如果您可以仔细查看,该变量甚至不会跟踪每个实例的计数 ,而是所有人的公共变量实例

第二种方法,看似看起来不错,但打印countcount并不清楚哪个实例,假设多个实例及其数量可能会发生。正确的方法是做,

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