web-dev-qa-db-ja.com

ファイル構造を維持しながら列のx-endを乗算する

入力として次のようなFile1があります。

A,22,1,2,3,4,5
G,26,5,6,7
X,28,10,20,10

ファイル構造を維持しながら、3列目の列に方程式を適用したいと思います。たとえば、使用したい方程式が2を掛けている場合、出力を探しています。

A,22,2,4,6,8,10
G,26,10,12,14
X,28,20,40,20

次のコマンドでこれを実行しようとしました。

awk -F ',' '{for(i=1; i<=NF; i++) if (i >= 3)
     print 2*$i
  else
    print $i }' File1

これは正しい出力を提供しますが、すべてのファイル構造を取り除きます。使用する場合、私が使用しようとしている実際の方程式は次のとおりです。2*(2 *($ i-1)+1)

私はまだこれにかなり慣れていないので、解決策に伴う説明は大歓迎です!

3
DNA_bash

出力フィールド区切り文字(OFS)を設定する必要があります。例:

awk '{ for (i=3; i<=NF; i++) $i*=2 } 1' FS=, OFS=, infile

またはあなたの式を使用して:

awk '{ for (i=3; i<=NF; i++) $i = 2*(2*($i-1)+1) } 1' FS=, OFS=, infile

出力:

A,22,2,4,6,8,10
G,26,10,12,14
X,28,20,40,20

スクリプトの最後にある1は、{ print $0 }の省略形です。

7
Thor

Perlは次のように取り組むことができます:@Thorによる提案に基づく:

$ Perl -F, -anE '$,="," ; say splice(@F,0,2), map { 2*(2*($_-1)+1) } @F' inp.csv

別のアプローチを使用する:

$ Perl -lpe '
   /^[^,]*,[^,]*/g; #positions the search engine before the 2nd comma.
   s/\G,\K([^,]*)/2*(2*($1-1)+1)/ge;
' inp.csv

GNU卓上計算ユーティリティは次のように実行できます:

$ < inp.csv tr ',-'  ' _' | sed -Ee 's/\S+/[&]/' |
    dc -e "
     [q]sq
     [44an]s,
     [1-2*1+2*]s=
     [SM lN1+sN z0<a]sa
     [LMnl,x LMnl,x lN2-sN]sb
     [LMl=xn lN1<, lN1-dsN0<c]sc
     [?z0=q 0sN lax lbx lcx 10an z0=?]s?
     l?x
"

これらは単純なnの単純なコードであるため、要求に応じて単純なユーティリティと説明になります。

簡単な説明:

dcユーティリティは、データnコードを格納するスタックで機能します。ここから、n個のリトリーブをレジスタに格納します。

文字列データは角括弧で囲まれています。

ロッピングは再帰を介して行われます。

このDCコードには、コードを格納する7つのレジスタがあります。つまり、q =、a b c?

2つのレジスタMNはデータを格納します。

最後から逆方向に作業します。コードレジスタ?入力から次の行を読み取るアクションを実行します。次に、スタック上にあるスペースで区切られたアイテムの数を比較します。それらをフィールドと考えてください。ケース0の場合、nquitを停止します。 z0 = qスニペットはそれを行います。 zは、存在する要素の数を返すdcコマンドです。これを0と比較し、等しい場合は、レジスタqに格納されているコードが実行されます。

2
Rakesh Sharma