Shell 如果同一目录中的其他文件与特定单词匹配,则删除所有文件
我在一个特定的目录中有几个文件。 一个文件中的特定字符串可能出现在另一个文件中。 如果此字符串在其他文件中。然后,应该删除出现此字符串的所有文件,并且只有一个文件保留该字符串 例如: file1 ShortName "Blue Jeans" price 89.47 cur EURO file2 ShortName "Blue Jeans" Price 59.47 CUR USD file3 ShortName "Blue Jeans" Price 99.47 CUR GBP 因为ShortName Blue Jeans的价值出现在文件2和文件3中。这两个文件都应该删除。类似地,使用其他短名称创建文件 任何人都可以帮助我如何通过脚本ksh,SED,AWK来完成它。我使用的是solaris。gawk解决方案仅适用于这3个文件,因为在撰写本文时没有提供其他信息Shell 如果同一目录中的其他文件与特定单词匹配,则删除所有文件,shell,scripting,Shell,Scripting,我在一个特定的目录中有几个文件。 一个文件中的特定字符串可能出现在另一个文件中。 如果此字符串在其他文件中。然后,应该删除出现此字符串的所有文件,并且只有一个文件保留该字符串 例如: file1 ShortName "Blue Jeans" price 89.47 cur EURO file2 ShortName "Blue Jeans" Price 59.47 CUR USD file3 ShortName "Blue Jeans" Price 99.47 CUR GBP 因为ShortN
awk 'FNR==NR && FNR==1{ get=$0; next}
FNR!=NR && FNR==1 && $0 ~ get{
cmd="rm \047"FILENAME"\047"
print cmd
# system(cmd) #uncomment to use
}' 1.txt 2.txt 3.txt
此脚本将查找所有重复项,并仅保留每个重复项的一个示例。例如,假设有三个蓝色牛仔裤文件、两个格子衬衫文件、一个运动鞋文件和几个没有短名称的文件。运行此脚本后,您应该各有一个:蓝色牛仔裤、格子衬衫和运动鞋,其他文件应保持不变。价格和货币完全被忽略了 偏执的免责声明:这是丑陋的,肯定会爆炸。警告买主。不退款
#!/bin/bash
dir="apparel"
saveIFS="$IFS"
IFS=$'\n'
strings=($(sed -n 's/ShortName "\(.*\)"/\1/p' ${dir}/*|sort|uniq -c)) # dummy comment to fix syntax coloring (ignore me) */
IFS="$saveIFS"
for string in "${strings[@]}"
do
count=${string:0:7}
count=${count// }
string=${string:8}
if [[ $count > 1 ]]
then
first=1
for f in $(grep -l "$string" ${dir}/*) # dummy comment to fix syntax coloring (ignore me) */
do
if [[ $first ]]
then
unset first
else
echo rm "$f"
fi
done
fi
done
测试回音以使rm正常工作后,请将其删除。如何确定要删除3个文件中的哪2个?此外,您是要将搜索字符串馈送到脚本,还是要查找多个文件中出现的任何字符串。1要删除的条件是ShortName。2不输入,文件已包含字符串。脚本应仅查找ShortName值。只有当ShortName值相同时,才应删除其他文件。因此,如果有20个文件,15个文件中出现了字符串BlueJeans,则应删除14个文件,只保留1个包含字符串的文件。然后应删除14个文件,只保留1个包含字符串的文件。-不考虑价格或货币?每个目录是否只有一个ShortName值?Daniel的意思可能是,你是要把Blue Jeans作为搜索的参数输入脚本,还是脚本必须发现这个副本是什么?你真的需要在规范方面做得更好。你好,丹尼斯和丹尼尔,我认为规范是明确的。我已经写了没有输入,文件已经包含字符串。5个文件可以有蓝色牛仔裤,4个文件可以包含黄色T恤。如果此字符串出现在另一个文件中,则应删除出现此字符串的文件。每个文件只应保留1个。谢谢。你好,鬼魂。谢谢你的回复。一个目录中有n个文件。不限于3。如何在目录中扩展n文件的脚本。谢谢。未测试,但您可以尝试1.txt*.txt。如果我没有错的话,它应该可以工作。您好,我尝试了您的脚本,我一直在第1行附近出现语法错误awk'FNR==NR&&FNR==1{get=$0;next}FNR=NR&&FNR==1&&0~get{cmd=rm\047FILENAME\047 print cmd}'file1.txt file2.txt我从脚本文件中的命令promt&尝试了它。我确保没有空格或不需要的字符。。我在solaris上使用了nwk,nawk'FNR==NR&&FNR==1{get=$0;next}FNR=NR&&FNR==1&&FNR==0~get{cmd=rm\047FILENAME\047 print cmd}'file1.txt file2.txt nawk:源代码第1行上下文的语法错误是FNR==NR&&FNR==1{get=$0;next}FNR=NR&&FNR==1&&0~get{cmd=rm>>>\047FILENAME\rm>>>是什么?你好,丹尼斯,是的,我测试了它,它正在工作。在什么情况下它会爆炸,它的陷阱是什么。我测试了大约30个文件。但在生产中,我预计会有200多个文件。这能存活吗?。你的观点..请。阅读你的评论后,我的信心有所提高对引用黄色T恤的注释的初始条件进行重复。陷阱:我没有对此进行广泛的测试,我认为如果文件名中有空格或其他类似字符,搜索字符串将不会有问题,搜索字符串可以在许多方式中的任何一种方式上更加健壮-这里有一种:^[\T]*ShortName[\T]\+\.\[\T]*$,使用${var:n:m}解析uniq-c的输出在某些系统上可能需要不同的n和m值,您可以将mv放入临时目录,然后检查它,然后删除它,等等。如果它在30个文件的测试中有效,那么它没有理由不适用于200个文件。一如既往,备份是您的朋友。