【问题标题】:How do I read a file into a matrix in bash?如何在 bash 中将文件读入矩阵?
【发布时间】:2018-05-01 08:44:39
【问题描述】:

我有一个这样的文本文件

A;green;3  
B;blue;2  
A;red;4  
C;red;2  
C;blue;3  
B;green;3  

我必须编写一个脚本,如果以参数"B" 开头,则会给我最大数字行的颜色(从以 B 开头的行)。在这种情况下,它将是最后一行,因此输出将是 "green"

如何通过";"-s 和换行符分隔元素并将它们存储到矩阵中以便我可以使用它?我什至需要这样做,还是有更简单的解决方案?

提前致谢!

【问题讨论】:

    标签: bash awk sh


    【解决方案1】:

    awk + sort 解决方案:

    awk -v param="B" -F';' '$1==param{ print $2; exit }' <(sort -t';' -k1,1 -k3nr file.txt)
    

    输出:

    green
    

    或者除了@William Pursell 的回答——只提取 color 值:

    awk -F';' '/^B/ && $3>m{ m=$3; c=$2 }END{ print c }' file.txt
    green
    

    通过 bash 脚本:

    get_max_color.sh脚本:

    #!/bin/bash
    
    awk -F';' -v p="$1" '$0~"^"p && $3>m{ m=$3; c=$2 }END{ print c }' "$2"
    

    用法:

    bash get_max_color.sh B "file.txt"
    green
    

    【讨论】:

    • 谢谢,它有效,但我希望它适用于任何参数。例如,如果我以“C”开头,它将搜索以 C 开头的行,选择具有最大数值的行,然后给我该行的颜色(在这种情况下为蓝色)
    • @Aaron,看看我的第一种方法,它有 -v param="B" 其中param 是一个变量,您可以更改为任何想要的值
    • 是的,我知道我可以更改它,但同样,如果我将其更改为其他内容,则代码仅适用于该参数。我想要它,所以如果我以“B”开头,它会给我“绿色”,如果我以“C”开头,它会给我“蓝色”,如果我以“A”开头,它会给我“红色”跨度>
    • @Aaron,你的 start it with 在技术上是什么意思?
    • sh script B 例如应该给我“绿色”
    【解决方案2】:

    您只需要过滤掉适当的行并存储具有所见最大值的行。显而易见的解决方案是:

    awk '/^B/ && $3 > m{s=$0} END { print s}' FS=\; input   
    

    要使用参数,请执行

    awk "/^$1/"' && $3 > m{s=$0} END { print s}' FS=\; input
    

    【讨论】:

    • 感谢您的回答,它确实为参数“B”提供了“绿色”输出,但它似乎不适用于 C 和 A。如果是“C”,我'd期望它输出“蓝色”,但它会抛出“绿色”,例如
    • 我得到“蓝色”:$ foo() { awk "/^$1/"' &amp;&amp; $3 &gt; m{s=$0} END { print s}' FS=\; input; } $ foo C C;blue;3
    【解决方案3】:

    awk 解决方案,可能不如已经提出的解决方案优雅和慢:

    sort -r -t\; -k1,1 -k3 file | uniq -w1 | grep "B" | cut -f2 -d\; 
    

    【讨论】:

      【解决方案4】:

      awk 来救援!

      可能不明白你想要达到的目标,但是

      awk -v key="$c" -F\; 'm[$1]<$3{m[$1]=$3; c[$1]=$2} END{print c[key]}' file
      

      将从文件中选择最高的编码颜色作为密钥

      一些糟糕的使用模式

      $ for c in A B C; 
        do        
          echo $c "->"  $(awk -v key="$c" -F\; 'm[$1]<$3 {m[$1]=$3; c[$1]=$2} 
                                                END      {print c[key]}' file); 
        done;
      
      A -> red
      B -> green
      C -> blue
      

      您可能可以在awk 中实现脚本的其余部分并执行一次此过程。

      或者,也许你想要一个关联数组,可以这样做:

      $ declare -A colors; 
        while IFS=\; read k c _ ; 
        do 
           colors[$k]=$c; 
        done < <(sort -t\; -k1,1 -k3nr file | uniq -w1)
      
      $ echo ${colors[A]}
      red
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多