【问题标题】:Change numbering according to field value by bash script通过bash脚本根据字段值更改编号
【发布时间】:2014-02-10 09:32:26
【问题描述】:

我有一个像这样的制表符分隔文件(没有标题,为了清楚起见,在示例中我使用竖线字符作为分隔符)

ID1|ID2|VAL1|
1|1|3
1|1|4
1|2|3
1|2|5    
2|2|6    

我想在此文件中添加一个新字段,该字段会在 ID1 或 ID2 更改时更改。像这样:

1|1|3|1
1|1|4|1
1|2|3|2
1|2|5|2    
2|2|6|3

这是否可以在 sed、awk、perl 等中使用单行程序...或者我应该使用标准编程语言 (Java) 来完成这项任务。在此先感谢您的时间。

【问题讨论】:

    标签: perl bash sed awk


    【解决方案1】:

    这是awk

    awk -F\| '$1$2!=a {f++} {print $0,f;a=$1$2}' OFS=\| file
    1|1|3|1
    1|1|4|1
    1|2|3|2
    1|2|5|2
    2|2|6|3
    

    【讨论】:

    • +1。就一个问题。你在哪里设置分隔符或制表符是默认的?
    • -F\| 将其设置为 | 用于输入,OFS=\| 将其设置为相同的输出。
    【解决方案2】:

    足够简单,但我相信你可以找出 1 行

    #!/bin/bash
    count=1
    while IFS='|' read -r id1 id2 val1; do
      #Can remove next 3 lines if you're sure you won't have extraneous whitespace
      id1="${id1//[[:space:]]/}"
      id2="${id2//[[:space:]]/}"
      val1="${val1//[[:space:]]/}"
      [[ ( -n $old1 && $old1 -ne $id1 ) || ( -n $old2 && $old2 -ne $id2 ) ]] && ((count+=1))
      echo "$id1|$id2|$val1|$count"
      old1="$id1" && old2="$id2"
    done < file
    

    例如

    > cat file
    1|1|3
    1|1|4
    1|2|3
    1|2|5    
    2|2|6  
    > ./abovescript
    1|1|3|1
    1|1|4|1
    1|2|3|2
    1|2|5|2
    2|2|6|3
    

    IFS='|' 替换为IFS=$'\t' 用于制表符分隔

    【讨论】:

    • 感谢您的帮助。我仍然不得不接受 Jotne 的回答,因为它更容易实现。对不起
    【解决方案3】:

    使用 awk

    awk 'FNR>1{print $0 FS (++a[$1$2]=="1"?++i:i)}' FS=\| file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多