Bash 脚本,用于有效地返回两个文件名,这两个文件名都包含在列表中找到的字符串



我正在尝试跨文件查找字符串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。

相关内容

最新更新