修剪特定字段并在 Unix Shell 脚本中替换

修剪特定字段并在 Unix Shell 脚本中替换

我有一个包含以下数据的文件:

5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222222222222222222222222222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|88888888888888888888888888888|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222222222222222222222222222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|55555555555555555555555555555|ABCD|AB|30

数据用 control-A 字符分隔,但我已将其替换为,|因为我无法使用 control-A 发布数据。

我想要修剪22222222222222222222222222222值并想要前 5 个值,所以我们的最终输出数据应该是这样的:

5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|88888|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|55555|ABCD|AB|30

在这方面寻找一些帮助。

答案1

awk你可以这样做:

awk -F\| 'BEGIN {OFS="|"};{$12=substr($12,1,5)};1' 

-F将字段分隔符设置为|,然后在开始处理文本之前,我们也使用该BEGIN块将输出字段分隔符 ( OFS) 设置为。|然后,我们将每条记录的第 12 个字段中的值替换为该字段的前 5 个字符。

您可以在命令行上将要处理的文件名作为另一个参数提供,这可能是您想要的,或者如果您有一个正在生成要更新的文件的进程,则可以在管道中使用它。

感谢 Stéphane Chazelas 修复了我遇到的一些问题并使其更加 POSIX-y。特别是,为了将我的起始索引从 0 修复为 1。GNU 的文档包含以下行,让我摆脱了这个错误:

如果 start 小于 1,则 substr() 会将其视为 1。

but1是第一个字符的索引,因此应该使用它,特别是对于不使用 的人gawk。例如mawk

$ mawk 'BEGIN{print substr("1234567", 0, 5)}'
1234
$ mawk 'BEGIN{print substr("1234567", 1, 5)}'
12345

答案2

awk

awk 'BEGIN{FS=OFS="\1"}; {$12=substr($12,1,5)}; 1' file
  • BEGIN{...}:在处理开始之前运行
  • FS=OFS="\1":将输入和输出字段分隔符设置为^A。根据维基词典 ^A是“消息头的第一个字符”,其八进制值为1
  • {$12=substr($12,1,5)}:修剪第 12 字段。
  • 1:打印(默认操作)记录。

答案3

sed 's/\([^|]\{0,5\}\)[^|]*/\1/12' <in >out

...或者使用 GNU 或 BSD sed

sed -E 's/([^|]{0,5})[^|]*/\1/12' <in >out

5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|88888|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|22222|ABCD|AB|30
5773|2015-11-19|2016418|O|2015-11-06|C|AB1CD|826|826|CDE|2015-11-19|55555|ABCD|AB|30

这非常简单:在任意数量的非管道字符序列的输入行上第 12 次可能出现的情况中,最多仅保留 5 个。

相关内容