
我想從文字檔案“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