解析文件列表

时间:2016-06-10 07:33:26

标签: git bash sh

想象一下,我们正在运行简单的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..

谁能帮帮我呢? 感谢

4 个答案:

答案 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快。