を使用して、awk
このテーブルに最初の行が "INFO"で、残りの行が "1"の列を追加したいと思います。
$ gunzip -c foo.gz | head
SNPID CHR BP Allele1 Allele2 Freq1 Effect StdErr P.value TotalN
rs1000033 1 226580387 t g 0.8266 -0.0574 0.0348 0.09867 17310
rs1000050 1 162736463 t c 0.8545 0.0654 0.0461 0.1564 10864
どこ
gunzip -c foo.gz | head | cat -A
SNPID^ICHR^IBP^IAllele1^IAllele2^IFreq1^IEffect^IStdErr^IP.value^ITotalN^M$
rs1000033^I1^I226580387^It^Ig^I0.8266^I-0.0574^I0.0348^I0.09867^I17310^M$
rs1000050^I1^I162736463^It^Ic^I0.8545^I0.0654^I0.0461^I0.1564^I10864^M$
.gz
私が使ったファイルです。
gunzip -c foo.gz | \
awk 'BEGIN {FS="\t"; OFS="\t"} NR == 1 {print $0 OFS "INFO"} NR > 1 {print $0 OFS "1"}' | \
gzip > foo.V2.gz
何らかの理由で、これは私の列名を変更するようですが、最後に予想される列は変更されません。
$ gunzip -c foo.V2.gz | head
SNPID INFO BP Allele1 Allele2 Freq1 Effect StdErr P.value TotalN
--------^
rs1000031 1 226580387 t g 0.8266 -0.0574 0.0348 0.09867 17310
rs1000051 1 162736463 t c 0.8545 0.0654 0.0461 0.1564 10864
奇妙なことは、cat -A
柱を見れば元々なければならないところにあるようだということです。
$ gunzip -c foo.V2.gz | head | cat -A
SNPID^ICHR^IBP^IAllele1^IAllele2^IFreq1^IEffect^IStdErr^IP.value^ITotalN^M^IINFO$
----------------------------------------------------------------------------^
rs1000033^I1^I226580387^It^Ig^I0.8266^I-0.0574^I0.0348^I0.09867^I17310^M^I1$
rs1000050^I1^I162736463^It^Ic^I0.8545^I0.0654^I0.0461^I0.1564^I10864^M^I1$
知りたい、
- ここで何が起こっているのでしょうか?
gunzip -c foo.V2.gz | head
今、その言葉を信じることができますかgunzip -c foo.V2.gz | head | cat -A
?- 以下を使用して予想出力を取得する方法
gunzip -c foo.V2.gz | head
SNPID CHR BP Allele1 Allele2 Freq1 Effect StdErr P.value TotalN INFO
rs1000033 1 226580387 t g 0.8266 -0.0574 0.0348 0.09867 17310 1
rs1000050 1 162736463 t c 0.8545 0.0654 0.0461 0.1564 10864 1
ノートSNPID=1; CHR=2; ...
、私は私が指定した列番号が後続の分析に適しているかどうかに応じて現在の場所を定義するために設定スクリプトを使用しています。
ベストアンサー1
すでに述べたように、DOS行の終わりがあります。バラより私のツール出力がそれ自体で上書きされる理由と回避策問題と考えられる回避策の説明(例:awkを使用):
gunzip -c foo.gz |
awk -v OFS='\t' '{sub(/\r$/,""); print $0, (NR>1 ? 1 : "INFO")}' |
gzip > foo.V2.gz
RS="\r\n"
最近、1〜2つの異なるawkバリアントに採用されているGNU awk拡張であるマルチキャラRSを使用できます。他のPOSIX準拠のawk設定は、設定したRS="\r\n"
ものと同じように扱われます。RS="\r"
各POSIXはRS
単一のリテラル文字しか使用できないためです。また、awkが表示する前にデフォルトのCプリミティブが行末を\r
削除するシステムでは失敗するため、RS="\r?\n"
より強力です。 awkの場合は、デフォルトRS
のままにしてスクリプトの最初のステートメントとして\n
追加できます。{sub(\r$/,"")}
また、不要な値または既に値を持つコード設定変数を削除し、2つの印刷ステートメントを1に変更し、OFSを設計どおりに使用し、パイプシンボルから不要なエスケープを削除するなど、スクリプトからいくつかの他のことも整理しました。その後行末。