我正在尝试跨文件查找字符串ID的重复项。其中每个 ID 都是唯一的,只能在一个文件中使用。我正在尝试验证每个 ID 是否只使用一次,脚本应该告诉我哪些 ID 是重复的以及在哪些文件中。
这是 set.csv 文件
的示例"Read-only",,"T","ID6776","3.1.1","Text","?"
"Read-only",,"T","ID4294","3.1.1.1","Text","?"
"Read-only","ID","T","ID7294","a )","Text","?"
"Read-only","ID","F","ID8641","b )","Text","?"
"Read-only","ID","F","ID8642","c )","Text","?"
"Read-only","ID","T","ID9209","d )","Text","?"
"Read-only","ID","F","ID3759","3.1.1.2","Text","?"
"Read-only",,"F","ID2156","3.1.1.3","
这是我写的非常低效的代码
for ID in $(grep 'ID","[TF]' set.csv | cut -c 23-31);
do for FILE1 in *.txt; do for FILE2 in *.txt;
do if [[ $FILE1 -nt $FILE2 && `grep -E '$ID' $FILE1 $FILE2` ]];
then echo $ID + $FILE1 + $FILE2;
fi;
done;
done;
done
从本质上讲,我只对在CSV中标识为"ID"的ID#感兴趣,该ID#将是7294,8641,8642,9209,3759,而不是其他ID。如果 File1 和 File2 都包含此集中的相同 ID,则它将打印出重复的 ID 以及在其中找到它的每个文件。
可能有数千个 ID 和文件,所以我的指数方法根本不是首选。如果 Bash 不能胜任,我将转向另一种语言的集合、哈希图和对数搜索算法......但如果外壳可以做到,我想知道怎么做。
谢谢!
编辑:好处是找到集合.csv中的哪些ID根本没有使用。另一种语言的伪代码可能是为 csv 中的所有 ID 创建一个集合,然后创建另一个集合并向其添加在文件中找到的 ID,然后比较这些集合。bash能完成这样的事情吗?
线性选项是使用 awk 存储发现的标识符及其相应的文件名,然后在再次找到标识符时报告。若
awk -F, '$2 == ""ID"" && ($3 == ""T"" || $3 == ""F"") {
id=substr($4,4,4)
if(ids[id]) {
print id " is in " ids[id] " and " FILENAME;
} else {
ids[id]=FILENAME;
}
}' *.txt
awk 脚本查看每个*.txt
文件;它根据逗号 (-F,
( 拆分字段。如果字段 2 是"ID"
字段 3 是"T"
或"F"
,则它从字段 4 中提取数字 ID。如果之前见过该 ID,它将报告以前的文件和当前文件名;否则,它会保存与当前文件名关联的 ID。