【问题标题】:How can I use multiple field separators or multiple awk to process columns如何使用多个字段分隔符或多个 awk 来处理列
【发布时间】:2016-09-13 20:38:35
【问题描述】:

我有一个制表符分隔的文件,如下所示

John  1,0   3,2   5,6
Mike  3,2    4,5   0,0
James 3,0    5,3   4,5

我想添加 3 个字段的所有第一个元素并添加 3 个字段的第二个元素输出以下内容

John 9,8
Mike 9,7
James 12,8 

在 awk 中是否有可以使用多个字段分隔符的解决方案?

【问题讨论】:

  • 多个FS在那里做什么?
  • 我需要按制表符解析字段,然后再按 "," 解析字段。那正确吗?对不起,我是初学者。如果我错了,请纠正我。谢谢
  • 顺便说一句,为什么第二行是Mike 9,7 而不是Mike 7,7
  • 如果你有James 3,0 5,3 4,9,它应该打印什么:James 12,12James 13,2

标签: regex bash shell awk sed


【解决方案1】:

awk 中可以使用多个分隔符:

awk -F '[\t,]+' -v OFS='\t' '{print $1, ($2+$4+$6) "," ($3+$5+$7)}' file

John    9,8
Mike    7,7
James   12,8

【讨论】:

  • 如果($3+$5+$7) > 9 会怎样?不会传播到单位。实际上,OP 没有指定数字是否应该被处理为带逗号的小数或几个数字。
  • OP 只想分别添加两个数字。没有提到 , 将被视为小数。
  • @Jean-FrançoisFabre 我怀疑你假设 , 是欧洲小数分隔符。我没有看到3,2 应该与3.2 浮点语法的含义相同的问题。显然,问题是关于添加“三个字段的第一个元素”和“第二个元素”。所以 3,2 是一个字段,它由两个子字段元素组成:3 和 2;它不是 3.2。
【解决方案2】:

我不知道awk,但这是bash 的(无聊)解决方案:

while read -r name f1 f2 f3; do
    s1=$((${f1%,*}+${f2%,*}+${f3%,*}))
    s2=$((${f1#*,}+${f2#*,}+${f3#*,}))
    echo "$name $s1,$s2"
done < input.txt

【讨论】:

  • 不要卖空它,它不仅无聊而且非常慢;-)。
【解决方案3】:
$ awk -F'[\t,]' '{delete s; for (i=2;i<=NF;i++) s[i%2]+=$i; print $1 "\t" s[0] "," s[1]}' file
John    9,8
Mike    7,7
James   12,8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-24
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多