次のファイルがあります。
Name Length EffectiveLength TPM NumReads
ENST00000456328.2|ENSG00000223972.5|OTTHUMG00000000961.2|OTTHUMT00000362751.1|DDX11L1-202|DDX11L1|1657|lncRNA| 1657 1493.961 0.112690 3.673
ENST00000450305.2|ENSG00000223972.5|OTTHUMG00000000961.2|OTTHUMT00000002844.2|DDX11L1-201|DDX11L1|632|transcribed_unprocessed_pseudogene| 632 468.996 0.000000 0.000
ENST00000488147.1|ENSG00000227232.5|OTTHUMG00000000958.1|OTTHUMT00000002839.1|WASH7P-201|WASH7P|1351|unprocessed_pseudogene| 1351 1187.961 9.176212 237.800
ENST00000619216.1|ENSG00000278267.1|-|-|MIR6859-1-201|MIR6859-1|68|miRNA| 68 69.000 0.000000 0.000
ENST00000473358.1|ENSG00000243485.5|OTTHUMG00000000959.2|OTTHUMT00000002840.1|MIR1302-2HG-202|MIR1302-2HG|712|lncRNA| 712 548.982 0.000000 0.000
ENST00000469289.1|ENSG00000243485.5|OTTHUMG00000000959.2|OTTHUMT00000002841.2|MIR1302-2HG-201|MIR1302-2HG|535|lncRNA| 535 372.012 0.000000 0.000
私は出力が次のようになります:
AWKを使って試しました。
awk 'BEGIN { OFS=FS="\t" } { sub("\\..*", "", $1); print }'
最初のID ENSTを印刷します。しかし、私がそれを次のように変更した場合:
awk 'BEGIN { OFS=FS="\t" } { sub("\\..*", "", $5); print }'
何もしません。
だから私は努力しました
awk -F\| '{print $5"\t"$7"\t"$9}'
動作しますが、長さ列が2回生成され、出力ファイルからヘッダーが失われます。
誰でも助けることができますか?
答え1
<TAB>
別々のファイルの最初の列には常に9つの要素があり(実際には「5つ以上の要素」で十分です)、パイプ()で区切られています(提供された|
例の9番目の要素は常に空です)。同じと仮定します。 5番目の要素のみを選択するには、AWKの便利なsplit
機能を使用できます。
awk -v FS='\t' -v OFS='\t' \
'NR > 1 { split($1, t, /\|/); $1 = t[5]; } 1' input_file |
column -t -R 2,3,4,5
column
~からユーティリティLinux次に、パッケージを使用して出力形式をテーブル(-t
)として指定し、オプションに右揃えの列-R
リストをカンマ区切りリストとして提供します。
必要に応じて、質問に表示されている出力とより密接に一致するように、フィールドを数値に強制することができます。たとえば、→と→を$5 = $5 + 0
取得します。237.800
237.8
0.000
0
あるいは、上記の仮定の下で、sub
質問に示されている機関ベースのアプローチを拡張しますが、以下が必要です。正確に最初のフィールドの9つ(空のパイプで区切られた要素かもしれません) - AWKスクリプトは次のようになります(他の条件は同じです)。
NR > 1 { gsub(/^([^|]*\|){4,4}|(\|[^|]*){4,4}$/,"",$1); } 1
gsub
Substituteは、2つの一致する部分文字列、つまり最初の4つの区切り要素(アンカーを参照)と最後の4つの要素(アンカーを参照)を削除しようとするためsub
に使用されます。|
^
$
答え2
世界はあなたの牡蠣です..
awk
分割すると、|
すべてのデータが最後のフィールドにあり、Name
データがその中にあるため、$(NF-4)
次のことができます。
awk -F'|' 'NR==1{print }NR>1{print $(NF-4) $NF}' file | column -t -R 2,3,4,5
Name Length EffectiveLength TPM NumReads
DDX11L1-202 1657 1493.961 0.112690 3.673
DDX11L1-201 632 468.996 0.000000 0.000
WASH7P-201 1351 1187.961 9.176212 237.800
MIR6859-1-201 68 69.000 0.000000 0.000
MIR1302-2HG-202 712 548.982 0.000000 0.000
MIR1302-2HG-201 535 372.012 0.000000 0.000
split
$NF
その後、引き続きフォーマットを\t
取得できます0
awk -F'|' '
NR==1{print }
NR>1{split($(NF),vs,"\\t"); print $(NF-4), vs[2]+0, vs[3]+0, vs[4]+0, vs[5]+0}' file |
column -t -R 2,3,4,5
Name Length EffectiveLength TPM NumReads
DDX11L1-202 1657 1493.96 0.11269 3.673
DDX11L1-201 632 468.996 0 0
WASH7P-201 1351 1187.96 9.17621 237.8
MIR6859-1-201 68 69 0 0
MIR1302-2HG-202 712 548.982 0 0
MIR1302-2HG-201 535 372.012 0 0
または、gがある場合は、複数の区切りawk
文字を使用することもできます[|\t]
。
awk -F'[|\t]' '
NR==1{print }
NR>1{print $(NF-8), $(NF-3)+0, $(NF-2)+0, $(NF-1)+0, $NF+0}' file |
column -t -R 2,3,4,5
Name Length EffectiveLength TPM NumReads
DDX11L1-202 1657 1493.96 0.11269 3.673
DDX11L1-201 632 468.996 0 0
WASH7P-201 1351 1187.96 9.17621 237.8
MIR6859-1-201 68 69 0 0
MIR1302-2HG-202 712 548.982 0 0
MIR1302-2HG-201 535 372.012 0 0
またはawk
完全に無視して
cut -d '|' --output-delimiter=" " -f 5,9 file | column -t -R 2,3,4,5
Name Length EffectiveLength TPM NumReads
DDX11L1-202 1657 1493.961 0.112690 3.673
DDX11L1-201 632 468.996 0.000000 0.000
WASH7P-201 1351 1187.961 9.176212 237.800
MIR6859-1-201 68 69.000 0.000000 0.000
MIR1302-2HG-202 712 548.982 0.000000 0.000
MIR1302-2HG-201 535 372.012 0.000000 0.000