ファイル区切り文字がawkコードで機能しない

ファイル区切り文字がawkコードで機能しない

次のファイルがあります。

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.800237.80.0000

あるいは、上記の仮定の下で、sub質問に示されている機関ベースのアプローチを拡張しますが、以下が必要です。正確に最初のフィールドの9つ(空のパイプで区切られた要素かもしれません) - AWKスクリプトは次のようになります(他の条件は同じです)。

NR > 1 { gsub(/^([^|]*\|){4,4}|(\|[^|]*){4,4}$/,"",$1); } 1

gsubSubstituteは、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

関連情報