2017-05-03 59 views
-2

我期待下面的數據解析:解析文本垂直到水平


T 
E 
S 
T 
_ 
7 
TTTTTTT 
EEEEEEE 
SSSSSSS 
TTTTTTT 
_______ 
5679111 
    012 

成類似:


TEST_7 
TEST_5, TEST_6, TEST_7, TEST_9, TEST_10, TEST_11, TEST_12 

任何建議腠幫助。 Ty

+0

到目前爲止您嘗試過什麼? –

+0

所有的字段都是固定的長度嗎? 「TEST_7」和「TEST_5」之間的界限是什麼? – dawg

+0

我試過sed進行文本處理,並查看了awk和perl,但目前爲止還沒有運氣。 – kumar

回答

1

awk來救援!

這基本上是一個置操作

awk 'BEGIN {FS=""} 
       {for(i=1;i<=NF;i++) a[NR,i]=$i; 
       if(max<NF)max=NF} 
     END {for(i=1;i<=max;i++) 
       {for(j=1;j<=NR;j++) printf "%s",a[j,i]; 
        print ""}}' file 

TEST_7TEST_5 
     TEST_6 
     TEST_7 
TEST_9 
TEST_10 
TEST_11 
TEST_12 

你需要解釋如何將此變換設置你想要的佈局規則。

1

的Python:

#!/usr/bin/python 
txt='''\ 
T 
E 
S 
T 
_ 
7 
TTTTTTT 
EEEEEEE 
SSSSSSS 
TTTTTTT 
_______ 
5679111 
    012 ''' 

row_len=max(len(line.rstrip()) for line in txt.splitlines())  
arr=[list('{:{w}}'.format(line.rstrip(), w=row_len)) for line in txt.splitlines()] 
print '\n'.join([''.join(t) for t in zip(*arr)]) 

或者awk

awk 'BEGIN{RS="[ ]*\n"} 
      {lines[NR]=$0 
      max=length($0)>max ? length($0) : max } 
     END{ for (i=1; i in lines; i++) 
       lines[i]=sprintf("%-*s", max, lines[i]) 
      for (i=1;i<=max; i++){ 
       for (j=1; j in lines; j++) 
        printf "%s", substr(lines[j], i, 1) 
       print "" 
      } 
}' file 

打印:

TEST_7TEST_5 
     TEST_6 
     TEST_7 
     TEST_9 
     TEST_10 
     TEST_11 
     TEST_12 
0

在awk中(爲-F ''以及GNU AWK):

$ awk -F '' ' 
NR!=1 && NF!=p { 
    for(i=1;i<=p;i++) 
     printf "%s%s",a[i],(i==p?ORS:"") 
    delete a 
    p=NF } 
NR==1 || NF==p { 
    for(i=1;i<=NF;i++) 
     a[i]=a[i] $i 
    p=NF 
    j++ } 
END { 
    for(i=1;i<=p;i++) 
     printf "%s%s",a[i],(i==p?ORS:", ") } 
' file 
TEST_7 
TEST_5 , TEST_6 , TEST_7 , TEST_9 , TEST_10, TEST_11, TEST_12 

當記錄長度(實際上NF)更改時,它檢測到更改(並緩衝打印)。