2014-02-09 79 views
0

我有一個這樣的製表符分隔的文件(無頭,並在例子中,我使用管道符號作爲分隔符爲清楚起見)編號根據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)的完成這個任務。在此先感謝您的時間。

回答

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 
+0

+1。只是一個問題。你在哪裏設置分隔符或製表符是默認的? – Alexandros

+0

'-F \ |'將其設置爲'|'用於輸入,而'OFS = \ |'設置爲輸出相同。 – Jotne

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=$'\t'更換IFS='|'爲製表符分隔

+0

感謝您的幫助。儘管如此,我仍然不得不接受Jotne的回答,因爲它更容易實施。對不起 – Alexandros

1

用awk

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