我有一个像这样的制表符分隔文件(没有标题,在示例中我为了清晰起见使用管道符号作为分隔符)
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)来执行此任务。在此先感谢您的时间。
答案 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