![ある列の正の値と負の値を別の列の値に分割し、結果を新しい列に追加する方法[閉じる]](https://linux33.com/image/221108/%E3%81%82%E3%82%8B%E5%88%97%E3%81%AE%E6%AD%A3%E3%81%AE%E5%80%A4%E3%81%A8%E8%B2%A0%E3%81%AE%E5%80%A4%E3%82%92%E5%88%A5%E3%81%AE%E5%88%97%E3%81%AE%E5%80%A4%E3%81%AB%E5%88%86%E5%89%B2%E3%81%97%E3%80%81%E7%B5%90%E6%9E%9C%E3%82%92%E6%96%B0%E3%81%97%E3%81%84%E5%88%97%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
大きなテキストファイルがありますが、7列(BETA)から8列(SE)までの値を分割し、結果(11列)を含むテーブルの末尾に新しい列を作成したいと思います。問題は、7列の値の一部が0を超えて負数であることです。
SNP CHR BP A1 AX A1_FREQ BETA SE P OBS_CT
rs10875231 1 100000012 T G 0.405 -0.0456807 0.02260471 0.04335677 4400
rs6678176 1 100000827 C T 0.383 0.02553138 0.02287662 0.2645817 4400
rs78590530 1 100000948 A G 0.016 0.171376 0.08757958 0.05035017 4400
rs149636485 1 100001060 A G 0.004 -0.03363731 0.1819208 0.8529224 4400
rs116216467 1 100001233 C T 0.043 -0.06690947 0.05683414 0.238941 4400
答え1
数字以外の文字列を含む最初の行が原因でエラーが発生します。次のように除外できます。
NR!=1 { $11 = $7/$8 }
1
これで、列8にゼロがある可能性があると思われる場合は、$ 8がゼロでないことを確認する必要があります。パターンに条件を追加できます。
NR!=1 && $8!=0 { $11 = $7/$8 }
1
または、if
以下を追加してください。
{ if (NR!=1 && $8!=0) $11 = $7/$8; print }
負の値がなぜ問題なのかわかりません。
答え2
awk 'BEGIN{print "SNP CHR BP A1 AX A1_FREQ BETA SE P OBS_CT"}NR>1{$11=$7-$8;print $0}' filename
output
SNP CHR BP A1 AX A1_FREQ BETA SE P OBS_CT
rs10875231 1 100000012 T G 0.405 -0.0456807 0.02260471 0.04335677 4400 -0.0682854
rs6678176 1 100000827 C T 0.383 0.02553138 0.02287662 0.2645817 4400 0.00265476
rs78590530 1 100000948 A G 0.016 0.171376 0.08757958 0.05035017 4400 0.0837964
rs149636485 1 100001060 A G 0.004 -0.03363731 0.1819208 0.8529224 4400 -0.215558
rs116216467 1 100001233 C T 0.043 -0.06690947 0.05683414 0.238941 4400 -0.123744