解析垂直于水平的文本

时间:2017-05-03 23:09:26

标签: linux awk sed grep

我正在寻找解析以下数据:

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

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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)发生变化时,它会检测到变化(并打印缓冲)。