從文字檔案中提取與標題子字串相符的列

從文字檔案中提取與標題子字串相符的列

我想從文字檔案“columns.txt”中提取製表符分隔的列,其中標題(第一行)與另一個文字檔案“string”中列出的子字串相符。
“columns.txt”看起來像這樣:

A   B   C   D   E   F   rs243_A   rs546_G   rs987_T   rs025_C   ...
A   B   C   D   E   F   0         0         0         1         ...
A   B   C   D   E   F   1         1         2         2         ...
A   B   C   D   E   F   0         1         2         0         ...
... ... ... ... ... ... ...       ...       ...       ...       ...

“strings.txt”看起來像這樣:

rs243
rs987  
...

輸出文字檔案應複製「columns.txt」中的第 1-6 列,然後新增「strings.txt」中指定的所有提取的列(製表符分隔)。輸出檔案“output.txt”應如下所示:

A   B   C   D   E   F   rs243   rs987   ...
A   B   C   D   E   F   0       0       ...
A   B   C   D   E   F   1       2       ...
A   B   C   D   E   F   0       2       ...
... ... ... ... ... ... ...     ...     ...

我使用的程式碼根據需要將第 1-6 列列印到“output.txt”,但不添加提取的列:

awk -F '\t' -f /data/p_00614/ABCD/scripts/extract.awk /data/strings.txt /data/columns.txt > /data/output.txt

與“extract.awk”:

BEGIN { OFS = FS }

FNR == NR {
    sub("_.*", "", $1)
    columns[$1] = 1
    next
}

FNR == 1 {
    for (i = 1; i <= NF; ++i)
        if (i <= 6 || $i in columns)
            keep[i] = 1
}

{
    nf = split($0, fields, FS)
    $0 = ""
    j = 0

    for (i = 1; i <= nf; ++i)
        if (i in keep)
            $(++j) = fields[i]

    print 
}

我覺得

sub("_.*", "", $1)

不起作用。"_.*"可能不會切割從開始的每個子字串_,而只是精確匹配。對於如何解決這個問題,有任何的建議嗎?謝謝你!

答案1

這是我提供的程式碼中的一個錯誤對你的一個問題的較早回答(現已更正)。該_.*位元不應從正在讀取的字串中刪除strings.txt,而應從正在讀取的資料中刪除columns.txt

更正的腳本:

BEGIN { OFS = FS }

FNR == NR {
    columns[$1] = 1
    next
}

FNR == 1 {
    for (i = 1; i <= NF; ++i) {
        sub("_.*", "", $i)
        if (i <= 6 || $i in columns)
            keep[i] = 1
    }
}

{
    nf = split($0, fields, FS)
    $0 = ""
    j = 0

    for (i = 1; i <= nf; ++i)
        if (i in keep)
            $(++j) = fields[i]

    print 
}

請注意問題中的FNR == NR和塊的細微變化。FNR == 1

相關內容