1

次のような80列ほどの大きなタブ区切りファイルがあります。

184     
2       
P   2853263 4998463
SS      
AG0001-C        
T/T      C/C      A/A
AG0002-C        
T/T      C/C      A/T   
AG0003-C        
T/T      C/C      A/A   
AG0004-C         
T/T      C/C      T/A

スラッシュ文字 ("\") を新しい行に置き換えて、1 つの列の内容が次のように 2 つの行に分割されるようにします。

184     
2       
P   2853263 4998463
SS      
AG0001-C        
T        C         A
T        C         A
AG0002-C        
T        C         A
T        C         T
AG0003-C         
T        C         A
T        C         A
AG0004-C        
T        C         T
T        C         A
4

4 に答える 4

3

このような入力の場合 (最初の列の左側に最初のタブはありません):

184
2
P   2853263 4998463
SS
AG0001-C
T/T C/C A/A
AG0002-C
T/T C/C A/T
AG0003-C
T/T C/C A/A
AG0004-C
T/T C/C T/A

このスクリプトは Mawk で動作するはずです:

#!/usr/bin/awk -f

NR <= 4 || NR % 2 { print; next; }
{
    rows = 0
    for (i = 1; i <= NF; ++i) {
        count = split($i, b, /\//)
        if (count > rows) {
            rows = count
        }
        for (j = 1; j <= count; ++j) {
            key = i "|" j
            a[key] = b[j]
        }
    }
    for (i = 1; i <= rows; ++i) {
        key = 1 "|" i
        printf("%s", a[key])
        for (j = 2; j <= NF; ++j) {
            key = j "|" i
            printf("\t%s", a[key])
        }
        print ""
    }
    for (i in a) {
        delete a[i]
    }
}

出力:

184
2
P   2853263 4998463
SS
AG0001-C
T   C   A
T   C   A
AG0002-C
T   C   A
T   C   T
AG0003-C
T   C   A
T   C   A
AG0004-C
T   C   T
T   C   A

次のようなさまざまな形式でも機能するはずです。

184
2
P   2853263 4998463
SS
AG0001-C
A/A/C/X/Y/Z T/T C/C A/A A/A/C/X A/A/B   A/A/C/X/Y
AG0002-C
T/T C/C A/T
AG0003-C
T/T C/C A/A
AG0004-C
T/T C/C T/A

出力:

184
2
P   2853263 4998463
SS
AG0001-C
A   T   C   A   A   A   A
A   T   C   A   A   A   A
C               C   B   C
X               X       X
Y                       Y
Z                       
AG0002-C
T   C   A
T   C   T
AG0003-C
T   C   A
T   C   A
AG0004-C
T   C   T
T   C   A

左側にタブがある入力の場合:

    184
    2
    P   2853263 4998463
    SS
    AG0001-C
    T/T C/C A/A
    AG0002-C
    T/T C/C A/T
    AG0003-C
    T/T C/C A/A
    AG0004-C
    T/T C/C T/A

このコード

#!/usr/bin/awk -f

NR <= 4 || NR % 2 { print; next; }
{
    rows = 0
    for (i = 1; i <= NF; ++i) {
        count = split($i, b, /\//)
        if (count > rows) {
            rows = count
        }
        for (j = 1; j <= count; ++j) {
            key = i "|" j
            a[key] = b[j]
        }
    }
    for (i = 1; i <= rows; ++i) {
        for (j = 1; j <= NF; ++j) {
            key = j "|" i
            printf("\t%s", a[key])
        }
        print ""
    }
    for (i in a) {
        delete a[i]
    }
}

の出力が得られます

    184
    2
    P   2853263 4998463
    SS
    AG0001-C
    T   C   A
    T   C   A
    AG0002-C
    T   C   A
    T   C   T
    AG0003-C
    T   C   A
    T   C   A
    AG0004-C
    T   C   T
    T   C   A
于 2013-08-29T10:28:50.950 に答える
1

使用sed:

$ sed -e "s|/|\t|g" -e "s/\([^\t]*\t[^\t]*\t[^\t]*\)\t\(.*\)/\1\n\2/" inputfile
184
2
P   2853263 4998463
SS
AG0001-C
T   T   C   
C   A   A   
AG0002-C
T   T   C   
C   A   T   
AG0003-C
T   T   C   
C   A   A   
AG0004-C
T   T   C   
C   T   A   
于 2013-08-29T10:13:22.767 に答える