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