通过bash脚本根据字段值更改编号

时间:2014-02-09 20:50:53

标签: perl bash sed awk

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

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)来执行此任务。在此先感谢您的时间。

3 个答案:

答案 0 :(得分:2)

这是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 :(得分: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',以用于制表符分隔

答案 2 :(得分:1)

使用awk

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