【问题标题】:How to print additional row based on the current column value using AWK如何使用 AWK 根据当前列值打印附加行
【发布时间】:2017-07-03 08:43:59
【问题描述】:

我有一个 txt 文件,其中包含:

adf8261:21:09:07 BAT SYNTAX_fa TRUE 273e-9,218e-9,136e-9,82e-9,82e-9,27e-9,0
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 54e-9,27e-9,0
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9,27e-9,27e-9,0

根据第 5 列,我想使用 AWK 将所有值放在一列中。 "," 用于分隔数据。

结果会是这样的:

adf8261:21:09:07 BAT SYNTAX_fa TRUE 273e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 218e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 136e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 27e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 0
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 54e-9
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 27e-9
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 0
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 0

【问题讨论】:

  • 你自己尝试了什么?

标签: awk


【解决方案1】:

awk解决方案:

awk -F'[[:space:]]+|,' '{ for(i=5;i<=NF;i++) print $1,$2,$3,$4,$i }' file
  • -F'[[:space:]]+|,' - 空格和逗号被视为字段分隔符

  • for(i=5;i&lt;=NF;i++) - 遍历第 5 个字段的 items

输出:

adf8261:21:09:07 BAT SYNTAX_fa TRUE 273e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 218e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 136e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 27e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 0
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 54e-9
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 27e-9
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 0
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 0

【讨论】:

    【解决方案2】:

    awk 中的另一个使用split:

    $ awk '{split($5,a,",");for(i in a) print $1,$2,$3,$4,a[i]}' file
    adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9
    adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9
    adf8261:21:09:07 BAT SYNTAX_fa TRUE 27e-9
    adf8261:21:09:07 BAT SYNTAX_fa TRUE 0
    adf8261:21:09:07 BAT SYNTAX_fa TRUE 273e-9
    adf8261:21:09:07 BAT SYNTAX_fa TRUE 218e-9
    adf8261:21:09:07 BAT SYNTAX_fa TRUE 136e-9
    qwe8261:21:09:10 BAT SYNTAX_fa TRUE 54e-9
    qwe8261:21:09:10 BAT SYNTAX_fa TRUE 27e-9
    qwe8261:21:09:10 BAT SYNTAX_fa TRUE 0
    oiu8261:21:09:08 BAT SYNTAX_fa TRUE 0
    oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
    oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
    oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
    

    由于for(i in a),输出将按随机顺序排列。这可以通过以下方式解决:

    ... n=split($5,a,","); for(i=1;i<=n;i++) print ...
    

    【讨论】:

    • 也可以用split($5,a,","); for(i=1;i in a;i++)修复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2018-01-07
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多