入力として次のような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)
私はまだこれにかなり慣れていないので、解決策に伴う説明は大歓迎です!
出力フィールド区切り文字(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 }
の省略形です。
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に格納されているコードが実行されます。