列に特定の文字がある場合は、特定の列の内容を分割します。

列に特定の文字がある場合は、特定の列の内容を分割します。

このデータタブは区別されています。

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」が追加されます。

列が再計算されると、新しい行が印刷されます。

おすすめ記事