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



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

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)来完成此任务。提前感谢您的时间。

这是一个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

bash很简单,尽管我相信你可以找出一个1行的awk

#!/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'

使用 awk

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

相关内容

  • 没有找到相关文章

最新更新