【问题标题】:Using awk to split a record into multiple fields使用 awk 将记录拆分为多个字段
【发布时间】:2017-05-04 11:55:23
【问题描述】:

我有一个文件,其中的记录没有用任何分隔符分隔。下面分享一个示例:

XXXXXYYYYZZZ
XXXXXYYYYZZZ
XXXXXYYYYZZZ
XXXXXYYYYZZZ
XXXXXYYYYZZZ

我已获得文件的 DDL,字段 1 位于位置 1-5,字段 2 位于位置 6-9,字段 3 位于位置 10-12

如何使用 awk 命令打印以下输出?

字段1,字段2,字段3
XXXXX,YYYY,ZZZ
XXXXX,YYYY,ZZZ
XXXXX,YYYY,ZZZ
XXXXX,YYYY,ZZZ
XXXXX,YYYY,ZZZ

【问题讨论】:

  • 从格式化你的描述开始,现在不可读
  • 字段长度可以变化。这只是一个示例。我的文件可以有超过 50 列字段 1 位置可能 1-10 ,字段 2 可能是 11-15 和儿子。此外,我需要如图所示的输出和标题。请帮助
  • 如果文件中的字段宽度不同,您将如何识别字段更改?
  • 您必须从 DDL 中导出字段宽度?你能告诉我们数据文件的 DDL 文件吗?

标签: awk


【解决方案1】:

在 GNU awk 中使用 FIELDWIDTHS:

$ awk '
BEGIN {
    FIELDWIDTHS="5 4 3"                 # here you state the field widths
    OFS=","                             # output field separator
    print "field1","field2","field3" }  # print header in BEGIN
{
    print $1,$2,$3 }                    # print 3 first fields, you could also:
' file                                  # {$1=$1; print} or even:
field1,field2,field3                    # {$1=$1}1
XXXXX,YYYY,ZZZ
XXXXX,YYYY,ZZZ
XXXXX,YYYY,ZZZ
XXXXX,YYYY,ZZZ
XXXXX,YYYY,ZZZ

如果您没有 GNU awk,请使用 f1=substr($0,1,5);f2=substr($0,6,4)...print f1,f2,f3

编辑:

$ awk '
BEGIN {
    OFS=","
    print "field1","field2","field3" }
{
    f1=substr($0,1,5)
    f2=substr($0,6,4)
    f3=substr($0,10,3)
    print f1,f2,f3 }
' file

后者作为插入;s 的单行:

$ awk 'BEGIN {OFS=","; print "field1","field2","field3"}{f1=substr($0,1,5); f2=substr($0,6,4); f3=substr($0,10,3); print f1,f2,f3}' file

前者作为单线:

$ awk 'BEGIN{FIELDWIDTHS="5 4 3"; OFS=","; print "field1","field2","field3"}{print $1,$2,$3}' file

【讨论】:

  • 我试过 awk 'BEGIN {f1=substr($0,1,5);f2=substr($0,6,4);f3=substr($0,10,3) print "field1" ,"field2","field3" } { 打印 f1,f2,f3 }' 文件 --- 它不起作用@james
  • awk 'BEGIN {FIELDWIDTHS="5 4 3" OFS="," print "field1","field2","field3" } { print $1,$2,$3 }' 文件`-- @james 没用。说语法错误
  • 显然您没有 GNU awk,请稍等,我将编辑后者作为完整答案。
  • awk -v FIELDWIDTHS="5 4 3" 'OFS="," { print "field1","field2","field3" } { print $1,$2,$3 }' a.txt --- 这段语法有效,但会打印每条记录的标题。请纠正我@james
  • awk '开始 {FIELDWIDTHS="5 4 3"; OFS=","; print "field1","field2","field3"}{print $1,$2,$3}' 文件----工作正常。非常感谢@james
【解决方案2】:

这可能对你有用(GNU sed):

sed -e '1i\field1,field2,field3' -e 's/[^,]/,&/6;s//,&/10' file

【讨论】:

  • @user3439894 完全正确。我没有看到标题。修改
猜你喜欢
  • 2016-07-25
  • 2019-09-23
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
相关资源
最近更新 更多