如何在bash中将文件读入矩阵?

时间:2017-11-17 14:26:52

标签: bash awk sh

我有一个像这样的文本文件

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

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

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

提前致谢!

4 个答案:

答案 0 :(得分:0)

awk + sort 解决方案:

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

输出:

green

或者除了@William Pursell的回答 - 只提取颜色值:

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

答案 1 :(得分:0)

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

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

要使用参数,请执行

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

答案 2 :(得分:0)

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="../js/jquery-3.2.1.min.js"></script> </head> <body> <svg width="300" height="300" viewBox="0 0 300 300" > </svg> <script> jQuery('<circle/>', { r: "25", cx: "80", cy: "80" }).appendTo('svg'); </script> </body> </html> 解决方案,可能不如已经提出的解决方案更优雅和更慢:

awk

答案 3 :(得分:0)

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