2016-06-10 70 views
-2

想象一下,我們正在運行簡單的git diff --name-only。輸出將是這樣的:解析文件列表

/path1/path2/path3/path4/file1 
/path1/path2/path3/path4/file2 
/path1/path2/file3 
/file4 
/path1/file5 

的目標是有這樣的功能,將能夠分析和計算路徑中的任何部分。例如,如果我運行:

// 1 -> is the column to watch/count. 
// In example output above it is: path1, path1, path1, path4, path1 
// For 2 -> path2, path2, path2, null, file5 
// For 3 -> path3, path3, file3, null, null 
git diff --name-only | someFn(1) 

它應輸出不同匹配的總數。 例如:

1 -> should output 2 (path1, file4) 
2 -> should output 3 (path2, null, file5) 
3 -> should output 3 (path3, file3, null) 

函數的輸出應該是一個簡單的數字0, 1, 2..

誰能幫我呢? 感謝

+0

哪個版本的bash('echo $ BASH_VERSION')?我問,因爲這是一個顯而易見的關聯數組的使用。那些在bash 4.0中,否則我們可以使用'awk'。 – cdarke

+0

$ BASH_VERSION是3.2.57(1)-release – user2573863

+0

@ hek2mgl我試圖用'grep -e'失敗。和'awk'的不同組合。 – user2573863

回答

2

嘗試awk與特定的字段分隔符:

git diff --name-only | awk -F "/" '{ print $2 }' 

將顯示

path1 
path1 
path1 
file4 
path1 

awk的基本各執/

您還可以指望使用awk匹配字符串,排序和uniq。

git diff --name-only | awk -F "/" '{ print $3 }' | awk 'NF' | sort -u | wc -l 
>2 

這將輸出第三列中,移除空行,結果進行排序,並刪除重複,最後計數的結果。 這些命令的組合應該能夠解決您的需求。

+1

背後的想法你錯過了'uniq'和'wc'之間的管道嗎? – cdarke

+0

謝謝,是的,我確實會糾正它! – cb0

+1

'awk -F「/」'{print $ 3}'| awk'NF''可以正確地爲:'awk -F「/」'$ 3!=「」{print $ 3}''。 'sort'通常有'sort -u',它與'sort |相同uniq'。 – andlrc

1

您可以定義一個函數,如:

function fun() { cut -d/-f $(($1+1)) | sort -u | wc -l ;} 

然後:

for i in $(seq 6) ; do 
    git diff --name-only | fun $i 
done 

function可以省略。

0

使用GAWK:

$ git diff --name-only | awk -F "/" 'NF > 2 { a[$3]=1 } 
            END { print length(a) }' 
2 
0

您還可以使用cut

git diff --name-only | cut -d '/' -f2 

會給你

path1 
path1 
path1 
file4 
path1 

進行排序和計數唯一值(如前面說的):

git diff --name-only | cut -d '/' -f2 | sort -u | wc -l 

我懷疑cut的解決方案運行速度比awk更大的輸入。