awk はタブ区切りファイルに列を追加しません。

awk はタブ区切りファイルに列を追加しません。

次のコードを使用して、他の既存の列の計算に基づいて、タブ区切りのtxtファイルに2つの新しい列(15と16)を追加しています。

問題:新しい列データが端末に表示されますが、ファイルは列に更新されません。別のファイル()に送信すると列はcode ... > Sample.....2.txt存在しますが、区切り文字はタブから空白に変わります。

必須:タブ区切りファイルの既存の列計算に基づいて、コードの行に列15と16を追加します。

ファイル: Sample1_RVDB_sort_unique.txt

パスワード:

awk '{$15 = ($4/$13)*100; $16 = ($4/$14)*100; print}' Sample1_RVDB_sort_unique.txt

データ

utg000001l  acc|GENBANK|MH883318.1|White    80.263  608 99  16  282 877 184245  184843  4.44e-120   438 2022    270609

答え1

入力ファイルがタブ区切りの場合は、入力フィールド区切り記号(FSまたはawk-Fオプションを使用)をタブ(\t)に設定する必要があります。それ以外の場合、awkはデフォルトのFS(1つ以上の空白を参照)を使用します。基本フィールド分割GNU awkドキュメントでは - しかし、これはawkだけでなくすべてのawkの動作ですgawk

出力をタブ区切りにするには、OFS出力フィールド区切り記号()もタブに設定する必要があります。それ以外の場合、awkはデフォルトのOFS(スペース)を使用します。

例えば

awk -F'\t' -v OFS='\t' '{ $15 = ($4/$13)*100;
                          $16 = ($4/$14)*100;
                          print
                        }' Sample1_RVDB_sort_unique.txt

答え2

フィールド区切り文字が何であるかをawkに知らせる必要があります。たとえば、次のようになります。

BEGIN { FS=OFS="\t" }

それ以外の場合は、入力が空白のチェーンであり、出力が単一の空白文字であると仮定します。

入力に14個のフィールドしかない場合、追加の出力フィールドを印刷することは、レコードに新しい$ 15および$ 16フィールドを作成するよりも効率的です(これにより、レコードは再コンパイルされます)。

awk '
    BEGIN { FS=OFS="\t" }
    { print $0, ($4/$13)*100, ($4/$14)*100 }
' Sample1_RVDB_sort_unique.txt

また、$13 および/または $14 がゼロでないことを確認する必要があります。たとえば、次のようになります。

awk '
    BEGIN { FS=OFS="\t" }
    { print $0, ($13 ? ($4/$13)*100 : "Inf"), ($14 ? ($4/$14)*100 : "Inf") }
' Sample1_RVDB_sort_unique.txt

または同様です。

答え3

使用幸せ(以前のPerl_6)

~$ raku -ne 'my @a = .words; put join "\t", @a, (@a[3]/@a[12])*100, (@a[3]/@a[13])*100;'   file

入力例:

utg000001l  acc|GENBANK|MH883318.1|White    80.263  608 99  16  282 877 184245  184843  4.44e-120   438 2022    270609

出力例:

utg000001l  acc|GENBANK|MH883318.1|White    80.263  608 99  16  282 877 184245  184843  4.44e-120   438 2022    270609  30.069238   0.2246784

上記は、Perlシリーズのプログラミング言語であるRakuで書かれた答えです。コマンド-neラインフラグは、Rakuに自動ではなく印刷モードで入力に対してコードを1行ずつ実行するように指示します(「n」は「not」を意味します)。

ルーチンを使用すると、スペース内の入力が破損しますwords。このコードは、where is Raku(およびPerl)の「テーマ変数」の略で、.wordsこの場合は入力行に設定されています。$_.words$_

入力は配列に割り当てられ、@a入力は追加の列(\tタブに結合)として計算/出力されます。 Perl / Rakuは0インデックスであることを忘れないでください。

https://raku.org

関連情報