想象一下,我们正在运行简单的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 :(得分:2)
尝试使用特定字段分隔符awk
:
git diff --name-only | awk -F "/" '{ print $2 }'
将显示
path1
path1
path1
file4
path1
awk基本上将字符串拆分为/
您还可以使用awk,sort和uniq计算匹配。
git diff --name-only | awk -F "/" '{ print $3 }' | awk 'NF' | sort -u | wc -l
>2
这将输出第三列,删除空行,对结果进行排序并删除重复项,最后计算结果。 这些命令的组合应该可以满足您的需求。
答案 1 :(得分: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
可能会被省略。
答案 2 :(得分:0)
使用GAWK:
$ git diff --name-only | awk -F "/" 'NF > 2 { a[$3]=1 }
END { print length(a) }'
2
答案 3 :(得分: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
快。