タブで区切られた列を含むファイルがありますtsv
。スペースで区切られた値を持つ5番目の列を取得したいと思います。区切りスペースをタブ区切りに変換し、新しいファイルとして保存します。
試み:
cut -d"\t" -f"4" input.tsv
awk -v OFS="\t" '$1=$1' input.tsv > output.tsv
入力する:
Composite_Element_REF Gene_Symbol Chromosome Genomic_Coordinate TCGA-KL-8323-01A-21D-2312-05 TCGA-KL-8324-01A-11D-2312-05 TCGA-KL-8325-01A-11D-2312-05
cg00000027 RBL0 14 53468110 0.0545368833399913 0.635089208882213 0.0581022991274144
cg00000028 RBL1 15 53468111 0.0545366588241415 0.635089205024173 0.0581085373336217
cg00000029 RBL2 16 53468112 0.0545366588040571 0.635089205078394 0.0581085373332275
予想出力:
Composite_Element_REF TCGA-KL-8323-01A-21D-2312-05 TCGA-KL-8324-01A-11D-2312-05 TCGA-KL-8325-01A-11D-2312-05
cg00000027 0.0545368833399913 0.635089208882213 0.0581022991274144
cg00000028 0.0545366588241415 0.635089205024173 0.0581085373336217
cg00000029 0.0545366588040571 0.635089205078394 0.0581085373332275
答え1
必要なものが、一部の入力ファイルで最初と5番目のタブで区切られたフィールドをインポートしてから、そのフィールドinput.tsv
に含まれるスペースをタブに変更することである場合は、以下をcut
使用してこれを実行できます。tr
cut -f 1,5 input.tsv | tr ' ' '\t' >output.tsv
まず、入力から最初と5番目のフィールドを抽出し、すべての空白文字をタブ文字に変更し、出力をファイルに書き込みます。最初のフィールドが変更されていない場合は、フィールドにスペースが含まれていないと見なされます。
タブはデフォルトの区切り文字であるため、cut
このオプションを使用する必要はありません-d
。
または以下を使用してくださいawk
。
awk 'BEGIN { OFS=FS="\t" }
{
nf = split($5, a, " ")
$0 = $1
for (i = 1; i <= nf; ++i) $(NF+1) = a[i]
print
}' input.tsv >output.tsv
これにより、タブで区切られた5番目のフィールドがスペースに分割され、すべての元のフィールドが最初のフィールドで上書きされます。結果レコードを出力する前に、ループの最初のフィールドの後に分割フィールドを追加します。
Miller(mlr
)を使用すると、入力をヘッドレスTSV(ヘッダーを単にデータとして扱うようにヘッドレス)に読み込み、関心のあるフィールドを切り取り、各レコードを私たちがするように再生成することを選択できますが、よりawk
短いです。
mlr --tsv -N put '$* = {1:$1, 2:splita($5, " ")}' input.tsv >output.tsv
各コマンドの出力は次のようになります。
Composite_Element_REF TCGA-KL-8323-01A-21D-2312-05 TCGA-KL-8324-01A-11D-2312-05 TCGA-KL-8325-01A-11D-2312-05
cg00000027 0.0545368833399913 0.635089208882213 0.0581022991274144
cg00000028 0.0545366588241415 0.635089205024173 0.0581085373336217
cg00000029 0.0545366588040571 0.635089205078394 0.0581085373332275
最初のフィールドにヘッダーが必要であると仮定し、-05
入力の2行目の別のヘッダーは誤っているため、ヘッダー行の最後のフィールドの末尾に追加する必要があることに注意してください。
答え2
使用awk
:
$ awk -F '\t' '{gsub(OFS,FS,$5); print $1 FS $5}' file
答え3
FWIW 実際に使用@PrapjhotSinghのソリューションただし、一般的な操作分野に関する有用な情報を提供できるいくつかの選択肢については、読み続けてください。
入力から表示された出力を取得するには、次に表示する必要があります。
$ awk -v OFS='\t' '{print $1, $5, $6, $7}' file
Composite_Element_REF TCGA-KL-8323-01A-21D-2312-05 TCGA-KL-8324-01A-11D-2312-05 TCGA-KL-8325-01A-11D-2312-05
cg00000027 0.0545368833399913 0.635089208882213 0.0581022991274144
cg00000028 0.0545366588241415 0.635089205024173 0.0581085373336217
cg00000029 0.0545366588040571 0.635089205078394 0.0581085373332275
$1=$1
または、コードで使用しようとしているものを見ると、次のようになります。
$ awk -v OFS='\t' '{$2=$3=$4=""; $0=$0; $1=$1} 1' file
Composite_Element_REF TCGA-KL-8323-01A-21D-2312-05 TCGA-KL-8324-01A-11D-2312-05 TCGA-KL-8325-01A-11D-2312-05
cg00000027 0.0545368833399913 0.635089208882213 0.0581022991274144
cg00000028 0.0545366588241415 0.635089205024173 0.0581085373336217
cg00000029 0.0545366588040571 0.635089205078394 0.0581085373332275
どこ:
$2=$3=$4=""
このフィールドをnullに設定し、フィールドはまだ空白ですが、$0
すべてのスペースとタブ文字(使用中のデフォルト値と一致)を単一のタブ(使用中)に置き換えて、元のスペースをタブに変更します。 、および3つのフィールドに分けられます。FS
OFS
$5
$5
$6
$7
$0=$0
フィールドに再分割しても$0
フィールド間のスペースは変更されないため、3つのフィールドは消えましたが、元のフィールド間の複数の$1
タブ$5
(Now$2
と)$3
は$4
まだ残ります。$1=$1
$1
独自に設定され、対応するフィールドで再構成され$0
ますが、複数の連続タブ(再び使用するデフォルトオプションFS
と一致)が単一のタブ(使用中)に置き換えられ、フィールドOFS
で区切られた4つのタブの最終出力が生成されます。になります。
NF
以下にこれらのさまざまなステップを見ることができます。フィールド間の間隔の変更と各行の先頭に印刷された値の変更を確認してください。
$ awk -v OFS='\t' '{print NF ": " $0}' < <(printf 'a\tb\tc\td\te f g\n')
7: a b c d e f g
$ awk -v OFS='\t' '{$2=$3=$4=""; print NF ": " $0}' < <(printf 'a\tb\tc\td\te f g\n')
7: a e f g
$ awk -v OFS='\t' '{$2=$3=$4=""; $0=$0; print NF ": " $0}' < <(printf 'a\tb\tc\td\te f g\n')
4: a e f g
$ awk -v OFS='\t' '{$2=$3=$4=""; $0=$0; $1=$1; print NF ": " $0}' < <(printf 'a\tb\tc\td\te f g\n')
4: a e f g
あるいは、GNU awkなどの一部のawkでは、次のいずれかを実行できます。
awk -v OFS='\t' '{$2=$5; $3=$6; $4=$7; NF=4} 1' file
awk -v OFS='\t' '{for (i=2; i<=4; i++) $i=$(i+3); NF=i-1} 1' file
3つのフィールドの値を上に移動し、元のフィールドと後続のフィールドを削除するために4に$5
設定しましたが、設定はPOSIX固有の未定義の動作であるため、他のawksは値を尊重したり無視したり、他の操作を実行できます。NF
$5
NF
答え4
使用幸せ(以前のPerl_6)
~$ raku -ne 'put join "\t", .words.[0,4..*];' file
上記は、Perlシリーズのプログラミング言語であるRakuで書かれた答えです。ここでは(@Kusalanandaと同じ)仮定します。「2行目に入力された唯一の文字は-05
スペルエラーなので、ヘッダー行の最後のフィールドの末尾に追加する必要があります。」(出典:@Kusalananda)。
つまり、自動印刷ではなく1行ずつフラグを使用してファイルを1行ずつ読み込みます-ne
。 Rakuの.words
ルーチンはトピック(入力行)を取り、余白の要素$_
に分割します。角かっこは、[0,4..*]
目的のゼロインデックス要素を選択します。これらは目的の出力を提供するタブjoin
に再結合されます。\t
入力例:
Composite_Element_REF Gene_Symbol Chromosome Genomic_Coordinate TCGA-KL-8323-01A-21D-2312-05 TCGA-KL-8324-01A-11D-2312-05 TCGA-KL-8325-01A-11D-2312-05
cg00000027 RBL0 14 53468110 0.0545368833399913 0.635089208882213 0.0581022991274144
cg00000028 RBL1 15 53468111 0.0545366588241415 0.635089205024173 0.0581085373336217
cg00000029 RBL2 16 53468112 0.0545366588040571 0.635089205078394 0.0581085373332275
出力例:
Composite_Element_REF TCGA-KL-8323-01A-21D-2312-05 TCGA-KL-8324-01A-11D-2312-05 TCGA-KL-8325-01A-11D-2312-05
cg00000027 0.0545368833399913 0.635089208882213 0.0581022991274144
cg00000028 0.0545366588241415 0.635089205024173 0.0581085373336217
cg00000029 0.0545366588040571 0.635089205078394 0.0581085373332275
「短い」行を処理するのはかなり簡単です。条件を追加するだけです。
~$ raku -ne 'put join "\t", .words.[0,4..*] if .words.elems == 7;' file
最後に、2つの異なる区切り文字を持つファイルがある場合は、個別に/連続的に管理できます。
~$ raku -ne '.split("\t", 5).[0,4].split(" ").join("\t").put;' file
最後の2つのソリューションは、上記と同じ「サンプル出力」を提供します。