1

awk の助けが必要です。csv ファイルを読み取り、一部の列で置換を行います。9列目(文字列型)を(9列目自体+4列目の値(整数))の値に、15列目を$15+$12、26列目を$26+$23という感じです。すべてのレコードに対して行ごとに同じことを行う必要があります。提案してください

以下はサンプル I/O です。説明である最初の行はそのままにしておく必要があります。

サンプル入力

EmpID|Empname|Empadd|roleId|roleDesc|Dept 
100|mst|Del|20|SD|DA 
101|ms|Del|21|XS|DA

サンプル出力

EmpID|Empname|Empadd|roleId|roleDesc|Dept 
100|mst100|Del|20|SD20|DA
101|ms101|Del|21|XS21|DA

empname が empid と連結され、役割の desc が roleID と連結されているようです。お役に立てば幸いです:)


4

2 に答える 2

1

これにより、必要な変換が実行されます。

$ awk 'NR>1{$2=$2$1;$5=$5$4}1' FS='|' OFS='|' file
EmpID|Empname|Empadd|roleId|roleDesc|Dept 
100|mst100|Del|20|SD20|DA
101|ms101|Del|21|XS21|DA

多くの列に対してこれを行う必要がある場合は、次のforようにループを使用できます (算術または幾何学的なステップサイズが提供されます)。

$ awk 'NR>1{for(i=2;i<=5;i+=3)$i=$i$(i-1)}1' FS='|' OFS='|' file
EmpID|Empname|Empadd|roleId|roleDesc|Dept 
100|mst100|Del|20|SD20|DA
101|ms101|Del|21|XS21|DA
于 2013-09-19T15:33:33.627 に答える
1

あなたが言うとき+、私はあなたが文字列連結を意味すると仮定しています。awk では、特定の連結演算子はなく、2 つの文字列を並べて配置するだけです。

awk -F, -v OFS=, '{$9 = $9 $4; $15=$15$12; $26=$26$23; print}' file.csv

また、「csv」とは、実際にはコンマ区切りを意味すると仮定します。

ファイルをその場で編集する場合は、次のようにする必要があります。

awk  ... file.csv > newfile && mv file.csv file.csv.bak && mv newfile file.csv

編集:最初の行をそのままにしておく:

awk -F, -v OFS=, 'NR>1 {$9 = $9 $4; $15=$15$12; $26=$26$23} {print}' file.csv

これで、2 行目以降の列が変更されますが、すべての行が印刷されます。次のように書かれていることが時々あります。

awk -F, -v OFS=, 'NR>1 {$9 = $9 $4; $15=$15$12; $26=$26$23} 1' file.csv
于 2013-09-18T16:19:12.623 に答える