【问题标题】:need some help on awk command在 awk 命令上需要一些帮助
【发布时间】:2013-11-19 17:39:12
【问题描述】:

在 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 连接一样。希望对您有所帮助:)


【问题讨论】:

  • awk '$9=$9$4; $15+=$12; ...
  • 所有这些列都是整数吗?您应该为此提供一些数据示例。
  • 显示一些有代表性的样本输入和预期输出。而且您不需要在 REPRESENTATIVE 输入/输出中有 26 列以上的列。

标签: unix awk


【解决方案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

【讨论】:

    【解决方案2】:

    当您说+ 时,我假设您的意思是字符串连接。在 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
    

    【讨论】:

    • 我只是忘了提到第一行,它包含字段的描述,必须保持原样。
    猜你喜欢
    • 2015-04-12
    • 2018-04-04
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多