私の入力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