awkを使用して列を分割する

awkを使用して列を分割する

以下のファイルがあります。列9の値は**につながります。

chrXV   234346  234546  snR81   +       SNR81   chrXV   234357  0.0003015891774815342**0.131826816475   +
chrXV   234346  234546  snR81   +       SNR81   chrXV   234385  0.0002208827994288481**0.0118547789578  +
chrXV   234346  234546  snR81   +       SNR81   chrXV   234396  0.0001799579220002955**0.00583993781634 +
chrXV   234346  234546  snR81   +       SNR81   chrXV   234410  0.003451057940295026**0.00352844797952  +

2つの値を別々の列として持つことができる出力が必要です。 awkでこれを行う方法。

これが私が望む出力です。出力の最初の行を表示します。

chrXV   234346  234546  snR81   +   SNR81   chrXV   234357  0.0003015891774815342   0.131826816475  +

答え1

人々がなぜcatを使ってファイルをawkにパイプするのかはわかりませんが、tr応答は1文字だけが別の文字に変換されるため、すべての文字*space.

シンプルなawkソリューション

awk -F"**" '$1=$1' OFS="\t" file 

すべてのフィールド間のタブの場合

awk 'sub(/\*\*/," "){$1=$1}1' OFS="\t" file

まだ一つあります。

awk 'gsub(/(*| )+/,"\t")' file

sed コマンド

sed 's/[* ]\+/\t/g' file

trコマンド

tr -s '* ' '\t'  < file

答え2

奇妙なことだと言うべきですか?cat file | tr '**' ' '**を空白の3つに置き換えるとどうなりますか?

答え3

cat text.txt  |awk '{ split($9,a , "**"); printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",$1,$2,$3,$4,$5,$6,$7,$8, a[1], a[2],$10); }'

出力は次のとおりです

chrXV   234346  234546  snR81   +   SNR81   chrXV   234357  0.0003015891774815342   0.131826816475  +
chrXV   234346  234546  snR81   +   SNR81   chrXV   234385  0.0002208827994288481   0.0118547789578 +
chrXV   234346  234546  snR81   +   SNR81   chrXV   234396  0.0001799579220002955   0.00583993781634    +
chrXV   234346  234546  snR81   +   SNR81   chrXV   234410  0.003451057940295026    0.00352844797952    +

答え4

awk -F'**' 'BEGIN{OFS="   ";} {print $1,$2}' file

'**'を区切り文字として使用し、3つのスペースを出力区切り文字に設定します。

関連情報