【问题标题】:Two-file processing in awkawk 中的两个文件处理
【发布时间】:2019-02-21 02:49:12
【问题描述】:

我有文件:

结果.txt

Apple fruits 10 20 30
Car  vehicle 40 50 60
Book study  70 80 90

这里假设第 2 列是特征,第 3 列是 Min,第 4 列是 Median,第 5 列是 Max。我有另一个文件config.txt,其中包含每个功能的属性,即

config.txt

fruits Max
vehicle Median
study Min

所以我想编写一个脚本,它只显示config.txt 文件中定义的功能的列号。

预期输出:

Apple fruits 30
Car vehicle 50
Book study 70

我正在关注此链接https://stackoverflow.com/a/40206489/10220825。这是我尝试过的:

awk 'FNR==NR{arr[$2];next} $1 in arr {var =$2;print var}' result.txt config.txt

我可以在一个变量中为result.txt 中定义的相应特征保存属性(如最小值、最大值、中位数),但无法显示该变量的列。请建议我如何打印相应列的列。

【问题讨论】:

    标签: awk sed


    【解决方案1】:
    $ awk 'BEGIN   {m["Min"]=3; m["Median"]=4; m["Max"]=5} 
           NR==FNR {a[$1]=$2; next}
                   {print $1,$2,$m[a[$2]]}' config result
    
    Apple fruits 30
    Car vehicle 50
    Book study 70
    

    您需要将 min/median/max 映射到相应的列索引,并通过配置文件查找需要打印的值。

    如果您想打印 Max/Min/Median 信息,请将 a[$2] 添加到打印中。

    NR==FNR {a[$1]=$2; next}awk 习惯用法,用于将 file1 加载到以第一个字段和第二个字段作为值作为索引的数组中,本质上是一个字典或查找表。

    【讨论】:

    • 还有一个帮助,请问我如何打印属性和结果。即Apple fruits Max 30
    • 另外解释一下,上面代码中a[$1]=$2; next是什么意思。
    【解决方案2】:

    你也可以试试 Perl

    perl -lane ' BEGIN { @kv{qw(Min Median Max)}=(2,3,4);
                %kw=map{chomp;split} qx(cat ratnesh_config.txt) } 
                $p=$kv{$kw{$F[1]}}; print "$F[0] $F[1] $F[$p]" ' ratnesh_in.txt
    

    使用给定的输入:

    $ cat ratnesh_config.txt
    fruits Max
    vehicle Median
    study Min
    
    $ cat ratnesh_in.txt
    Apple fruits 10 20 30
    Car  vehicle 40 50 60
    Book study  70 80 90
    
    $ perl -lane 'BEGIN { @kv{qw(Min Median Max)}=(2,3,4);%kw=map{chomp;split} qx(cat ratnesh_config.txt) } $p=$kv{$kw{$F[1]}}; print "$F[0] $F[1] $F[$p]" ' ratnesh_in.txt
    
    Apple fruits 30
    Car vehicle 50
    Book study 70
    
    $ perl -lane 'BEGIN { $kv{Min}=2;$kv{Median}=3;$kv{Max}=4;%kw=map{chomp;split} qx(cat ratnesh_config.txt) } $p=$kv{$kw{$F[1]}}; print "$F[0] $F[1] $F[$p]" ' ratnesh_in
    .txt
    Apple fruits 30
    Car vehicle 50
    Book study 70
    
    $ perl -lane 'BEGIN { @kv{qw(Min Median Max)}=(2,3,4);%kw=map{chomp;split} qx(cat ratnesh_config.txt)} $p=$kv{$kw{$F[1]}}; print "@F[0,1,$p]" ' ratnesh_in.txt
    Apple fruits 30
    Car vehicle 50
    Book study 70
    
    $
    

    【讨论】:

      【解决方案3】:

      请您尝试关注一下。

      awk '
      FNR==NR{
        a[$2,"max"]=$1 OFS $5
        a[$2,"min"]=$1 OFS $3
        a[$2,"median"]=$1 OFS $4
        next
      }
      {
        $2=tolower($2)
      }
      (($1,$2) in a){
        split(a[$1,$2],array," ")
        print array[1],$1,array[2]
      }' SUBSEP=" "  results.txt config.txt
      

      输出如下。

      Apple fruits 30
      Car vehicle 50
      Book study 70
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        • 2016-09-05
        • 1970-01-01
        相关资源
        最近更新 更多