【问题标题】:Split column using awk or sed使用 awk 或 sed 拆分列
【发布时间】:2017-08-25 02:42:38
【问题描述】:

我有一个包含以下文本的文件。


AA 6469
bb 5946
cc 715


AA 5692


AA 3056
bb 2893
cc 1399
dd 33

我需要以下输出:

A-Z ,aa ,bb, cc, dd
狗, 6469, 5946,715, 0
猫 ,5692, 0, 0, 0
鸟,3056, 2893, 1399, 33

我试过了: awk '{$1=$1}1' OFS=","RS= 但没有给出我需要的格式。

提前感谢您的帮助。

危机

【问题讨论】:

  • 你试过awk '{$1=$1}1'?这应该很好笑吗?

标签: bash perl unix awk sed


【解决方案1】:

使用 Perl

perl -00 -nE'
    ($t, %p) = split /[\n\s]/; $h{$t} = {%p};     # Top line, Pairs on lines
    $o{$t} = ++$c;                                # remember Order
    %k = map { $_, 1} keys %p;                    # find full set of subKeys
    }{                                            # END block starts
    say join ",", "A-Z", sort keys %k;
    for $t (sort { $o{$a} <=> $o{$b} } keys %h) { 
        say join ",", $k, map { ($h{$k}{$_} // 0) } sort keys %k;
    }
' data.txt

按原始顺序打印

A-Z,aa,bb,cc,dd 狗,6469,5946,715,0 猫,5692,0,0,0 鸟,3056,2893,1399,33

【讨论】:

    【解决方案2】:

    这是一个 sed 解决方案,它适用于您的输入,但要求您提前知道列名,并且列名以从第一个列名开始的排序完整范围给出(所以没有像 aa, ccbb, aabb, cc) 并且每个段落后跟一个空行。如果您没有正好四个数字列,您还需要调整脚本:

    echo 'A-Z, aa, bb, cc, dd';sed -e '/./{s/.* //;H;d};x;s/\n/, /g;s/, //;s/$/, 0, 0, 0, 0/;:a;s/,[^,]*//5;ta' file

    如果您需要查找 sed 命令,可以查看 info sed,尤其是 3.5 不太常用的命令

    【讨论】:

      【解决方案3】:

      awk 来救援!

      awk -v OFS=, 'NF==1 {h[++c]=$1} 
                    NF==2 {v[c,$1]=$2; ks[$1]} 
                    END   {printf "%s", "A-Z"; 
                           for(k in ks) printf "%s", OFS k; 
                           print ""; 
                           for(i=1;i<=c;i++) 
                             {printf "%s", h[i]; 
                              for(k in ks) printf "%s", OFS v[i,k]+0; 
                              print ""}}' file'
      

      列的顺序是随机的。

      【讨论】:

      • 感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 2019-11-12
      • 1970-01-01
      • 2013-02-27
      • 2012-04-30
      相关资源
      最近更新 更多