【问题标题】:How do you "normalize" a list of records with awk您如何使用 awk “规范化”记录列表
【发布时间】:2014-04-16 23:33:48
【问题描述】:

假设我有一个制表符分隔的记录列表,每条记录有两个字段,像这样

bobby joe, jr   a,b,c
sue smith       b,d

假设在名称列和包含一系列单个字母的列之间有一个 TAB 字符。

目标是“规范化”数据,使其看起来像这样:

bobby joe, jr   a
bobby joe, jr   b
bobby joe, jr   c
sue smith       b
sue smith       d

我想具体了解如何使用awk 执行此操作。

【问题讨论】:

  • 分隔符是制表符。名称字段或逗号分隔的字段中没有制表符。

标签: awk


【解决方案1】:

您可以使用定义spaces*comma 作为可能的分隔符,然后循环打印第一个字段加上另一个字段的字符串,就像这样:

$ awk -F" *|," '{for (i=2; i<=NF; i++) print $1, $i}' file
bob a
bob b
bob c
sue b
sue d

鉴于更新后的问题,使用data TAB records,您可以像这样拆分records

$ awk -F"\t" '{n=split($2,a,","); for (i=1;i<=n;i++) print $1, a[i]}' file
bobby joe, jr a
bobby joe, jr b
bobby joe, jr c
sue smith b
sue smith d

说明

  • -F"\t" 将制表符设置为字段分隔符。
  • n=split($2,a,",") 在给定 , 分隔符的情况下将第二个字段分成几部分。当split() 返回件数时,我们将该数字存储在n 中。
  • for (i=1;i&lt;=n;i++) print $1, a[i] 循环遍历这些片段并将它们与第一个字段一起打印。

【讨论】:

  • 但是如果我有制表符分隔的字段,并且第二个字段(未显示,但在第一个和第三个字段之间)可能包含空格或逗号?
  • 那么你最好更新你的问题,显示一些这样的示例输入。
  • @dan 只需将 -F" *|," 更改为 -F"\t|,"
  • @veryhungrymike 请查看问题的最新更新版本
  • @dan 刚刚编辑回答这个data TAB records 新输入文件。
【解决方案2】:

如果你想要漂亮的印刷品和整个shebang:

$ echo  -e "bobby joe, jr\ta,b,c\nsue smith\tb,d" \
    | awk -F"\t" '
BEGIN {MaxLen = 0} 
{
    a[NR] = $0; 
    if (length($1) > MaxLength) { 
        MaxLength = length($1)
    }
} 
END { 
    for (i in a) { 
        split(a[i], Fields); 
        split(Fields[2], Values, ","); 
        for (j = 1; j <= length(Values); j++) {
            printf("%-"MaxLength"s\t%s\n", Fields[1], Values[j])
        }
    }
}'
bobby joe, jr   a
bobby joe, jr   b
bobby joe, jr   c
sue smith       b
sue smith       d

【讨论】:

  • 请注意,如果您只是循环使用for (i in values),您可能会失去订单。请参阅Why does awk seem to randomize the array? 以获取更多参考。
  • 感谢您的回答。不过我不得不把它交给@fedorqui,因为他先发帖并处理了我的编辑。
  • @fedorqui 我知道这一点。 OP没有说明顺序很重要。我更容易使用PROCINFO["sorted_in"],但有些人不是最新的 gawk 版本。
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 2013-06-04
  • 2012-01-03
相关资源
最近更新 更多