【问题标题】:Seach pattern in Header and print the entire column在标题中搜索模式并打印整个列
【发布时间】:2017-12-08 18:51:42
【问题描述】:
NAME    10/01   09/02   09/07   09/08   09/09   09/10   09/11   09/12   09/13   09/14   09/15   09/16   09/17   09/18   09/19   10/01
CNMPMT_DATA 99.22       99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22
DATA01  9.79    10.75   13.67   7.97    15.22   15.1    14.63   15.71   15.56   15.37   16.69   17.33   17.06   16.5    18.01   99.22
DATATBLS4PEAS   9.21    7.45    51.77   8.26    54.56   54.43   50.68   42.2    38.23   53.47   51.02   49.53   48.01   46.58   46.34   99.22
EDD_DATA        57.79   57.71   58.46   57.58   57.93   59.09   58.88   58.88   58.83   58.79   58.77   58.73   58.7    59.69   59.34   99.22
EDD_INDX        23.34   23.44   22.96   23.27   23.07   22.94   22.79   22.94   23.06   23.03   23.13   23.25   23.08   22.81   23.05   99.22
INDX01  8.59    8.74    8.68    8.72    8.94    8.71    8.46    8.78    8.87    8.82    9.19    9.41    9.21    8.86    9.38    99.22
SYSAUX  96.65   96.67   96.62   96.92   96.55   96.57   96.56   96.59   96.57   96.63   96.65   96.7    96.72   96.73   96.65   99.22
SYSTEM  93.37   93.37   93.36   93.38   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36   99.22
TEMP    97.43   98.50   98.54   88.77   99.54   95.68   99.54   99.52   99.25   99.35   96.44   98.87   98.53   98.54   98.13   99.22
TEMP_EDDDATA    96.58   96.58   96.58   96.58   96.58   96.58   96.58   96.55   96.55   96.55   96.55   96.54   96.37   96.37   96.38   99.22
UNDOTBS1        22.35   14.31   34.18   30.17   5.37    8.94    17.08   17.43   14.7    22.96   11.99   7.83    .02     8.07    3.67    99.22
UNDOTBS2        42.45   47.22   53.84   43.96   25.77   36.5    40.05   28.89   27.75   26.86   23.4    22.86   .02     .03     6.56    99.22
UNDOTBS3        68.65   72.3    39.89   28.95   44.52   69.05   71.89   52.23   48.23   41.67   31.52   30.09   16.98   23.44   18.54   99.22
USERS   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   99.22

这个文件我只想要九月份的列。文件是制表符分隔的。 尝试低于其工作,但它改变了列位置

awk 'NR==1{for(i=1; i<=NF; i++) if ($i ~"09") {a[i]++;} } { for (i in a) printf "%s\t", $i; printf "\n"}' Allen_Free.txt


09/07   09/08   09/09   09/10   09/11   09/12   09/13   09/14   09/15   09/16   09/17   09/18   09/19   09/02
99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22
13.67   7.97    15.22   15.1    14.63   15.71   15.56   15.37   16.69   17.33   17.06   16.5    18.01   10.75
51.77   8.26    54.56   54.43   50.68   42.2    38.23   53.47   51.02   49.53   48.01   46.58   46.34   7.45
58.46   57.58   57.93   59.09   58.88   58.88   58.83   58.79   58.77   58.73   58.7    59.69   59.34   57.71
22.96   23.27   23.07   22.94   22.79   22.94   23.06   23.03   23.13   23.25   23.08   22.81   23.05   23.44
8.68    8.72    8.94    8.71    8.46    8.78    8.87    8.82    9.19    9.41    9.21    8.86    9.38    8.74
96.62   96.92   96.55   96.57   96.56   96.59   96.57   96.63   96.65   96.7    96.72   96.73   96.65   96.67
93.36   93.38   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.37
98.54   88.77   99.54   95.68   99.54   99.52   99.25   99.35   96.44   98.87   98.53   98.54   98.13   98.50
96.58   96.58   96.58   96.58   96.58   96.55   96.55   96.55   96.55   96.54   96.37   96.37   96.38   96.58
34.18   30.17   5.37    8.94    17.08   17.43   14.7    22.96   11.99   7.83    .02     8.07    3.67    14.31
53.84   43.96   25.77   36.5    40.05   28.89   27.75   26.86   23.4    22.86   .02     .03     6.56    47.22
39.89   28.95   44.52   69.05   71.89   52.23   48.23   41.67   31.52   30.09   16.98   23.44   18.54   72.3
22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09

09/02 应该先出现,然后 09/07 不确定是什么问题。

请帮忙。

【问题讨论】:

    标签: linux awk sed


    【解决方案1】:

    如果perl解决方案没问题,

    $ perl -MList::MoreUtils=indexes -nale '@i = indexes { /^09/ } @F if $. == 1; print join "\t", @F[@i]' ip.txt 
    09/02   09/07   09/08   09/09   09/10   09/11   09/12   09/13   09/14   09/15   09/16   09/17   09/18   09/19
    99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22   99.22
    10.75   13.67   7.97    15.22   15.1    14.63   15.71   15.56   15.37   16.69   17.33   17.06   16.5    18.01
    7.45    51.77   8.26    54.56   54.43   50.68   42.2    38.23   53.47   51.02   49.53   48.01   46.58   46.34
    57.71   58.46   57.58   57.93   59.09   58.88   58.88   58.83   58.79   58.77   58.73   58.7    59.69   59.34
    23.44   22.96   23.27   23.07   22.94   22.79   22.94   23.06   23.03   23.13   23.25   23.08   22.81   23.05
    8.74    8.68    8.72    8.94    8.71    8.46    8.78    8.87    8.82    9.19    9.41    9.21    8.86    9.38
    96.67   96.62   96.92   96.55   96.57   96.56   96.59   96.57   96.63   96.65   96.7    96.72   96.73   96.65
    93.37   93.36   93.38   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36   93.36
    98.50   98.54   88.77   99.54   95.68   99.54   99.52   99.25   99.35   96.44   98.87   98.53   98.54   98.13
    96.58   96.58   96.58   96.58   96.58   96.58   96.55   96.55   96.55   96.55   96.54   96.37   96.37   96.38
    14.31   34.18   30.17   5.37    8.94    17.08   17.43   14.7    22.96   11.99   7.83    .02 8.07    3.67
    47.22   53.84   43.96   25.77   36.5    40.05   28.89   27.75   26.86   23.4    22.86   .02 .03 6.56
    72.3    39.89   28.95   44.52   69.05   71.89   52.23   48.23   41.67   31.52   30.09   16.98   23.44   18.54
    22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09   22.09
    
    • -MList::MoreUtils=indexes 使用来自List::MoreUtils 模块的indexes 函数
    • -ale 在空格上拆分输入行并保存到 @F 数组,输入行中的换行符在打印时被剥离并添加
    • @i = indexes { /^09/ } @F if $. == 1 如果是第一行,则获取与正则表达式 /^09/ 匹配的 @F 数组中所有元素的索引
    • print join "\t", @F[@i] 打印@F 匹配索引保存在@i 数组中的元素,以制表符分隔

    如果List::MoreUtils模块不可用,

    perl -nale '@i = grep { $F[$_] =~ /^09/ } 0..$#F if $. == 1; print join "\t", @F[@i]' ip.txt
    

    【讨论】:

    • 谢谢 Sundeep。得到这个 Can't locate List/MoreUtils.pm in @INC(@INC 包含:而且我不熟悉 perl
    • cat text1.txt | perl -F'\t' -nae ' my ($s,$m,$h,$md,$month) = localtime(); $mon=sprintf("%2.2d", $month+1); print $mon chomp @F; if (/^NAME/) { @columns = @F; } for $i (0..$#F) { if ($i == 0 || $columns[$i] =~ /^$mon/) { print "\t" if $i != 0; print $F[$i]; }; } print "\n" ' 这工作了
    【解决方案2】:

    awk 对于按行处理数据非常有用,因此您可以先转置数据。

    我会这样做:

    来自An efficient way to transpose a file in Bash

    function transpose() {
        awk '{ 
            for (i=1; i<=NF; i++)  {
                a[NR,i] = $i
            }
        }
        NF>p { p = NF }
        END {    
            for(j=1; j<=p; j++) {
                str=a[1,j]
                for(i=2; i<=NR; i++){
                    str=str" "a[i,j];
                }
                print str
            }
        }'
    }
    

    然后

    cat file.txt | transpose | awk 'NR==1 { print $0 } /[0-9]+\/09/ { print $0 }' | transpose
    

    【讨论】:

    • 感谢您的回复,但功能出错
    • 在转置后移除 () 它工作但它显示的第一列是名称和 09/09 列 NAME 09/09 CNMPMT_DATA 99.22 DATA01 15.22 DATATBLS4PEAS 54.56 EDD_DATA 57.93 EDD_INDX 23.07 INDX01 8.94 SYSAUX 96.55 SYSTEM 93.36 TEMP 99.54 TEMP_EDDDATA 96.58 UNDOTBS1 5.37 UNDOTBS2 25.77 UNDOTBS3 44.52 USERS 22.09
    • 这可能是因为您没有将这些命令输入到 bash shell 中。你实际上不必定义一个函数,但它更好,因为它被重用了。您可以删除NR==1 { print $0 },它不会打印行名。
    • 仍然只为 09/09 行提供价值
    • 更改正则表达式以匹配您想要的模式。
    猜你喜欢
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2018-07-30
    • 2015-02-16
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多