拆分列并使用第一个数组到headerin awk

时间:2016-09-22 14:25:31

标签: bash awk split header

我的文件看起来像这样:

A=10 B=8 C=12
A=15 B=12 C=5
A=6 B=4 C=9
A=8 B=8 C=9

列更多。我想使用awk拆分所有文件,并在“=”之前使用字母,如标题:

A B C
10 8 12
15 12 5
6 4 9
8 8 9

我想做点什么:

awk '{split($0,arr0,"="); print arr0[2]}' infile

但仍然不知道如何使用arr0[1]之类的标题。

感谢您的任何想法。

7 个答案:

答案 0 :(得分:4)

$ awk 'NR==1{h=$0;gsub(/=[^ ]+/,"",h);print h} {gsub(/[^ =]+=/,"")} 1' file
A B C
10 8 12
15 12 5
6 4 9
8 8 9

答案 1 :(得分:3)

使用awk你可以这样做:

awk -F '[= ]' 'function prnt(start) {
   for (i=start; i<=NF; i+=2)
      printf "%s%s", (i==start?"":OFS), $i
   print ""
}
NR==1 {
   prnt(1)
}
{
   prnt(2)
}' file

A B C
10 8 12
15 12 5
6 4 9
8 8 9

要获得表格格式化输出,请使用:

awk -F '[= ]' 'function prnt(start) {
   for (i=start; i<=NF; i+=2)
      printf "%s%s", (i==start?"":OFS), $i
   print ""
}
NR==1 {
   prnt(1)
}
{
   prnt(2)
}' file | column -t

A   B   C
10  8   12
15  12  5
6   4   9
8   8   9

答案 2 :(得分:1)

使用sed

sed '1{h;s/=[^ ]*//g;p;x};s/.=//g' file

A B C
10 8 12
15 12 5
6 4 9
8 8 9

答案 3 :(得分:1)

perl

$ cat ip.txt 
A=10 B=8 C=12
A=15 B=12 C=5
A=6 B=4 C=9
A=8 B=8 C=9

$ # can also use: perl -lpe 'print / ?[^ ]+(?==)/g if $.==1; s/[^ ]+=//g'
$ perl -pe 'if($. == 1){$a = s/=[^ ]+//rg; print "$a\n"} s/[^ ]+=//g' ip.txt
A B C
10 8 12
15 12 5
6 4 9
8 8 9
    第一行
  • if($. == 1){$a = s/=[^ ]+//rg; print "$a\n"},删除右侧的=和非空格字符。替换结果保存在$a并打印而不修改输入行
  • s/[^ ]+=//g删除所有行的=后面的非空格字符
  • -p选项表示默认情况下在所有修改后打印输入行

答案 4 :(得分:1)

试试这个:

#!/bin/awk

function print_record( hdr )
{
    for( i = 1; i <= NF; i++ )
    {
        split( $i, a, "=" )
        printf a[ ( hdr == 1 ) ? 1 : 2 ] " "
    }

    print ""
}

BEGIN {
    hdr=1
}

{
    if( hdr == 1 )
    {
        print_record( 1 )
        hdr = 0;
    }

    print_record( 0 )
}

# eof #

测试:

$ awk -f script.awk -- input.txt

输出:

A B C 
10 8 12 
15 12 5 
6 4 9 
8 8 9 

希望它有帮助!

答案 5 :(得分:1)

Gnu awk:

split($0,a,"[ =]") && NR==1 {   # split the record from <space> and "="
    print a[1],a[3],a[5]        # first record, print odds
    # for(i=1;i<=NF*2;i+=2)     # you could replace above print with this
    #    printf "%s", a[i] OFS; print ""
}
{
    print a[3],a[4],a[6]        # the rest of records, print evens
    # for(i=2;i<=NF*2;i+=2)     # you could replace above print with this
    #     printf "%s", a[i] OFS; print ""
}

测试它:

$ awk foo.awk foo.txt
A B C
10 8 12
15 12 5
6 4 9
8 8 9

答案 6 :(得分:1)

这是一个精简的awk实施:

BEGIN{
  print "A", "B", "C";
}

{
  split($1, a, /=/);
  split($2, b, /=/);
  split($3, c, /=/);

  print a[2], b[2], c[2];
}

...和输出:

$ awk -f /tmp/script.awk </tmp/input
A B C
10 8 12
15 12 5
6 4 9
8 8 9