awk使用for循环遍历数组并基于if条件进行打印

时间:2013-12-30 10:53:08

标签: arrays if-statement for-loop awk cut

   bash --version

bash --version GNU bash,版本3.2.25(1)-release(x86_64-redhat-linux-gnu) 版权所有(C)2005 Free Software Foundation,Inc。

  

cat filename.txt | cut -d“|” -f1 | tr -d [^:digit:] [:punct:]
  [:blank:] | tail -10 | awk'{a [i ++] = $ 0;} {k = length(a)} END {for   (i = k; i> = 1; i - )if(5 == 5){print i“”a [i]“”a [i-1]“”k}}'

10            10
9  18410      10
8 18410 18409 10
7 18409 18408 10
6 18408 18407 10
5 18407 18406 10
4 18406 18405 10
3 18405 18404 10
2 18404 18403 10
1 18403 18402 10


cat filename.txt|cut -d "|" -f1|tr -d [^:digit:][:punct:]   [:blank:]|tail -10|awk '{a[i++]=$0;}{k=length(a)}END{for (i=k;i>=1;i--)if ((a[i]-1)==a[i-1]){print i " "a[i] " "k} else print "not done"}'

not done
not done
not done
not done
not done
not done
not done
not done
not done
not done

如果前面的数字小于x,则尝试获取最大数字x

wc -l没有给出我需要的行数。我不需要行数。

使用cut提取的列是此csv文件中的主键。 文件最后可能有未知数量的空白行。

 cat filename.txt|cut -d "|" -f1|tr -d [^:digit:][:punct:]    [:blank:]|tail -10
18402
18403
18404
18405
18406
18407
18408
18409
18410

为什么这个条件评估采取“其他行动”? (a [i] -1 == a [i-1])评估为假。我不明白为什么。

1 个答案:

答案 0 :(得分:1)

给出以下CSV文件(filename.txt):

1a|b|123
2a|b|123
3|4
5.7|4
66
67
10|11
11|aaa

我们可以使用以下方式确定数字67:

awk -f s.awk filename.txt

其中s.awk是:

BEGIN {
    FS="|"
}
NF>=1 {
    q=$1
    gsub(/([^[:digit:]])|([[:blank:][:punct:]])*/,"",q)
    if (q==(prev+1))
        if (q>max)
            max=q
    prev=q
}
END {
    print "Max=" max
}

<强>更新

单线可能看起来像:

awk 'BEGIN { FS="|" } { q=$1; gsub(/([^[:digit:]])|([[:blank:][:punct:]])*/,"",q); if (q==(prev+1)) {if (q>max) max=q} prev=q } END { print "Max=" max }' filename.txt