2016-09-22 33 views
1

我有文件看起來像這樣:拆分列,並使用第一陣列headerin AWK

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]像標題。

謝謝你的任何想法。

+1

這裏是一個,只是改變了':'分隔符'=':http://stackoverflow.com/questions/39398986/how-to-preprocess-and-load -a-big-data-tsv-file-into-a-python-dataframe/39399727#39399727 –

+0

@JamesBrown是的我以前沒有找到這個解決方案。 – Geroge

回答

2

使用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 
+0

非常感謝你提供了很好的awk解決方案。它對我很好.. – Geroge

+0

很高興知道它解決了[[你可以點擊答案左上角的勾號**標記答案](http://meta.stackexchange.com /一個/160242分之5235) – anubhava

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 
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選項意味着輸入行獲取默認的所有修改後印刷
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 

希望它能幫助!

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 
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 
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