A / B / C / d
对我来说这个字符串有4个组件。进入文件的字符串有不同的长度。我正在寻找一种有效的方法,也许是在BASH中,以获得每个字段的唯一字符串数量。
我真的很感激任何帮助或提示!
谢谢!
MIC
答案 0 :(得分:2)
假设字符串总是由/
分隔,以下是我在Python中的方法
start1 = "A/B/C/D"
start2 = "B/D/E/A/B"
start3 = "D/A/A/B/D/C"
start4 = "C"
startList = [start1, start2, start3, start4]
print "startList: ", startList
fields = []
for start in startList:
for field in start.split('/'):
fields.append(field)
print "fields: ", fields
countDict = dict.fromkeys(fields)
print "countDict 1: ", countDict
for entry in countDict.keys():
countDict[entry] = fields.count(entry)
print "countDict 2: ", countDict
以下是print
语句输出的内容:
startList: ['A/B/C/D', 'B/D/E/A/B', 'D/A/A/B/D/C', 'C']
fields: ['A', 'B', 'C', 'D', 'B', 'D', 'E', 'A', 'B', 'D', 'A', 'A', 'B', 'D', 'C', 'C']
countDict 1: {'A': None, 'C': None, 'B': None, 'E': None, 'D': None}
countDict 2: {'A': 4, 'C': 3, 'B': 4, 'E': 1, 'D': 4}
但是,如果起始字符串是巨型(数百万条目)并且速度非常重要,那么Python可能不是您的最佳选择。它易于学习,而且非常易读(以及我最喜欢的语言),但它的速度不如C
等编译语言快。话虽如此,它对于绝大多数应用来说足够快
关于这种特殊方法的说明。有很多“更有趣”的方法来计算列表中的条目。许多更快,更“pythonic”,但这应该足以满足您的目的。如果您想查看这些方法,只需在网站上快速搜索即可。如果此方法中的任何内容不清楚,请告诉我,希望这有帮助!
如果你想要的是每个字符串中唯一条目的数量,那么这就是你要找的:
start1 = "A/B/C/D"
start2 = "B/D/E/A/B"
start3 = "D/A/A/B/D/C"
start4 = "C"
startList = [start1, start2, start3, start4]
print "startList: ", startList
countDict = dict.fromkeys(startList)
print "countDict 1: ", countDict
for start in startList:
countDict[start] = len(set(start.split('/')))
print "countDict 2: ", countDict
以下是print
语句输出的内容:
startList: ['A/B/C/D', 'B/D/E/A/B', 'D/A/A/B/D/C', 'C']
countDict 1: {'B/D/E/A/B': None, 'A/B/C/D': None, 'C': None, 'D/A/A/B/D/C': None}
countDict 2: {'B/D/E/A/B': 4, 'A/B/C/D': 4, 'C': 1, 'D/A/A/B/D/C': 4}
答案 1 :(得分:0)
如果你关注个别部分:
for n in 1 2 3 4 5 6 7
do
echo "for field # $n, unique values:"
cut -d / -f $n collection-of-strings | sort | uniq -c
done
如果您正在查看URI类型的前缀:
for n in 1 2 3 4 5 6 7
do
echo "for fields # 1…$n, unique prefices:"
cut -d / -f 1-$n collection-of-strings | sort | uniq -c
done
这假设您的字段数不超过7个,如果字符串较长,则相应地调整for
循环。
答案 2 :(得分:0)
给定“URL”位,假设您的意思是计算唯一组件而不是每个组件中的字数。然后我可能不会因为简单而使用bash,但如果我不得不做类似
的事情检查输入是否包含/
[[ $input == *"/"* ]]
检查输入是否包含空格字符
[[ $input != *[[:space:]]* ]]
将内部字段分隔符(IFS)设置为/
IFS="/" #Note you are doing this in a shell script and not directly in a shell
从输入中创建一个数组。
arr=($input)
使数组唯一。有关最简单的答案,请参阅https://stackoverflow.com/a/17758600/3076724
然后打印组件数/每个
做一些事情echo "Number of components in $input = ${#arr[@]}"
for i in "${arr[@]}"; do
#Do something with each component "$i"
done
这应该让你开始,你可以轻松地将它们连接在一起,制作一个有效的shell脚本。