【问题标题】:Unix Shell ProgrammingUnix Shell 编程
【发布时间】:2015-06-23 20:26:16
【问题描述】:

有一个包含 200 行的输入文件,每行只有一个字段,它是一个数字。 例如

89970060122507635800

我需要创建一个输出文件,使其看起来像每个输入行,如下所示:

INSERT,89970060122507635800,425062250763580,,0000,29514215,0000,29514215,,,,NORMAL,425062260621583,Blank,sim,9877

地点:

  1. 除第二个和第三个字段外,所有字段都具有常量值(包括逗号内的空值)
  2. 第二个字段由输入文件填充,第三个字段是通过从第二个字段中删除最后一个数字并将开头的 899700601 替换为 42506 获得的(如示例中所示)。

我确信我可以找到方法来做到这一点(我会在得到答案之前尝试),但我更想知道您认为哪种方法更有效。 awk、sed、shell脚本同时使用?

【问题讨论】:

  • “请为我提供完整的解决方案以获得最佳选择。”这句话会让你的问题结束,所以我删除了它。实际上,如果您在提出问题之前 完成研究,那会更好。 “我确信我能找到方法来做到这一点……”
  • 您可以使用任何 shell,sedawk 来执行此操作。我建议 awk 在 shell 之前和 shell 在 sed 之前。
  • 在选择要使用的工具时寻求建议很难从“太宽泛”中挽救。不乏可行的方法——包括没有外部工具的本机 shell(没有 sed、没有 awk、没有其他任何东西)——但这归结为见仁见智,除非你提供足够的细节来识别什么样的效率很重要。 (我们是在处理足够少的行,我们关心最小化启动时间,还是处理足够多的行,我们最关心最大化吞吐量?我们是否有可用的高性能 shell,例如 ksh93,或者我们需要处理用 bash?等)。

标签: shell unix awk


【解决方案1】:

这会将输入中的开头“123”替换为“AAA”,并修剪第三个字段的最后一位。

awk -v OFS="," '{$2=substr($1,1,length($1)-1); gsub(/^123/,"AAA",$1); print "bla bla bla",$1,$2,"bla bla bla"}'

替换魔法值并为打印语句添加适当的模板。

【讨论】:

  • 对不起,亲爱的,但 gsub 不能以某种方式工作。我在 awk 文件中做了类似的事情,但它会修剪最后一个数字,而不是替换那些数字:-(
  • 再次抱歉,我的错误...它确实有效,并且与我的做法相似:-)
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
相关资源
最近更新 更多