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

ファイル構造を維持しながら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)

ソリューションに付属の説明はまだ非常に慣れていないので、非常に感謝します!

答え1

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 }

答え2

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
"

シンプルで明確なコードなので、リクエストに応じた簡単なユーティリティと説明です。

簡単な説明:

このdcユーティリティは、データとコードが保存されるスタックで動作します。ここでは、n個の検索をレジスタに保存します。

文字列データは角かっこで囲まれます。

削除は再帰的に行われます。

このDCコードには、コードを格納する7つのレジスタ、つまりq =、abc?

2つのレジスタMNはデータを記憶する。

最後から始めて逆さまに作業してください。コード登録?入力から次の行を読み取る操作を実行します。次に、スタックにスペースで区切られた項目がいくつあるかを比較します。 0の場合は停止して終了します。 z0=q フラグメントがまさにそのことをします。次のように読みます。 z は、存在する要素の数を返す dc コマンドです。 0と比較して等しい場合は、レジスタqに格納されたコードを実行します。

答え3

s=`awk '{print NR}' p.txt| sort -nr | sed -n '1p'`
praveen@praveen:~$ for ((i=1;i<=$s;i++)); do m=`awk -v i="$i" -F "," 'NR==i{print NF}' p.txt`; for ((u=1;u<=$m;u++)); do if [[ $u < 3 ]]; then awk -v  i="$i" -v  u="$u" -F ","  'NR==i{print $u}'  p.txt; else awk -v i="$i" -v u="$u" -F "," 'NR==i {print 2*$u}' p.txt; fi; done| sed "N;s/\n/,/g"| sed "N;s/\n/,/g"| sed "N;s/\n/,/g"; done

where p.txt is filename



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

関連情報