このデータタブは区別されています。
ed00011 89 0.12 NA NA No
ed0002s 28 0.11 c3(3.1e-1) NA No
ed0001 22 0.37 NA 186_CR_NCR8_Ot(1.5e-6) No
ed0002a 596 0.89 c301(9.5e-2) 17_CY7_Ot(0.03) Yes
「(...)」がある場合は、これに基づいて列4と5を分割したいと思います。存在しない場合はNAのみです。たとえば、
ed00011 89 0.12 NA NA NA NA No
ed0002s 28 0.11 c3 3.1e-1 NA NA No
ed0001 22 0.37 NA NA 186_CR_NCR8_Ot 1.5e-6 No
ed0002a 596 0.89 c301 9.5e-2 17_CY7_Ot 0.03 Yes
ここで提案されたコマンドを試しました。awkを使用して列を分割する しかし、「(...)」がなければ、熱が混乱します。どんな提案がありますか?
ベストアンサー1
awk 'BEGIN { OFS="\t"; }
{
if (match($4, /\(.*\)/) > 0) {
$4=substr($4, 1, RSTART - 1)"\t"substr($4, RSTART + 1, RLENGTH - 2)
} else {
$4=$4"\tNA"
}
if (match($5, /\(.*\)/) > 0) {
$5=substr($5, 1, RSTART - 1)"\t"substr($5, RSTART + 1, RLENGTH - 2)
} else {
$5=$5"\tNA"
}
print
}' input > output
ここでの基本構造は、フィールド 4 またはフィールド 5 に各行に一致する角かっこのペアが含まれていることを確認することです。その場合は、フィールドをタブ区切りの2つの値、つまり角かっこの前部分と角かっこ内の部分に置き換えます。 RSTART 値は開かれたかっこが入る位置であり、RLENGTH 値には閉じ括弧が含まれているため、長さがわずかに調整されることがわかります。フィールドに括弧がない場合は、タブ文字と「NA」が追加されます。
列が再計算されると、新しい行が印刷されます。