1

需要 awk 的帮助。读取 csv 文件,并对某些列进行一些替换。就像第 9 列(字符串类型)应该替换为(第 9 列本身的值 + 第 4 列的值(整数)),然后第 15 列替换为 $15+$12,第 26 列替换为 $26+$23。所有记录都必须逐行完成。请提出建议

下面是示例 I/O。第一行是 Description 必须保持原样。

样本输入

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 中,没有特定的连接运算符,您只需将两个字符串并排放置。

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 回答
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 回答