gpt4 book ai didi

arrays - 使用 linux/bash 计算列元素的数量

转载 作者:太空宇宙 更新时间:2023-11-04 05:02:16 24 4
gpt4 key购买 nike

我有许多制表符分隔的文件,其中的数据有点像这样

Header1               Header2....... Headern
Cat Bat mat pat
Hat rat
Rat [Not Applicable]
[Not Available] [Not Applicable]

我需要获取每个标题的有效行数。无效条目为[不可用]、[不适用]等。我正在尝试获取数组中的 header 元素。直到这里一切都很好。但是,我发现很难计算每个标题的数量。我还使用数组来存储标题的行值。但问题是数组将 [Not as a different element and available] 存储为其他元素。另外,对于第一个 header ,“Cat Bat”应该是一个条目,但数组可能也为此存储了 2 个条目。

最佳答案

让我们从这个制表符分隔的文件开始:

$ cat file
Header1 Header2
Cat Bat mat pat
Hat rat
Rat [Not Applicable]
[Not Available] [Not Applicable]

对于每一列,以下计算不以 [Not A 开头的条目:

$ awk -F'\t' 'NR==1{for (i=1;i<=NF;i++)h[i]=$i;next} {for (i=1;i<=NF;i++)c[i]+=($i !~ /[[]Not A/)} END{for (i=1;i<=NF;i++)print h[i],c[i]}' file
Header1 3
Header2 2

它是如何工作的

  • -F'\t'

    这将字段分隔符设置为制表符。

  • NR==1{for (i=1;i<=NF;i++)h[i]=$i;next}

    对于第一行,这将保存数组 h 中的所有 header 然后跳过其余命令并跳转到next线。

  • {for (i=1;i<=NF;i++)c[i]+=($i !~ /[[]Not A/)}

    对于第一行之后的所有行,这会遍历每一列并递增 c[i]如果列的值 i不以 [Not A 开头.

  • END{for (i=1;i<=NF;i++)print h[i],c[i]}

    读取最后一行后,打印出结果。

更新

假设,除了 [Not Applicable][Not Available] ,我们想忽略 [unavailable] (注:全部小写)。在这种情况下,我们对正则表达式稍作更改:

awk -F'\t' 'NR==1{for (i=1;i<=NF;i++)h[i]=$i;next} {for (i=1;i<=NF;i++)c[i]+=($i !~ /[[](Not A|unavailable)/)} END{for (i=1;i<=NF;i++)print h[i],c[i]}' file

关于arrays - 使用 linux/bash 计算列元素的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29381601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com