次のコードを使用して、他の既存の列の計算に基づいて、タブ区切りの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インデックスであることを忘れないでください。