我有一个包含以下数据的文件:
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 个。