タブ区切りファイルの最初と5番目の列を検索して、5番目の列のスペースをタブに変換します。

タブ区切りファイルの最初と5番目の列を検索して、5番目の列のスペースをタブに変換します。

タブで区切られた列を含むファイルがあります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つのフィールドに分けられます。FSOFS$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$5NF

答え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つのソリューションは、上記と同じ「サンプル出力」を提供します。

https://raku.org

関連情報