Shell 如果同一目录中的其他文件与特定单词匹配,则删除所有文件

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

我在一个特定的目录中有几个文件。 一个文件中的特定字符串可能出现在另一个文件中。 如果此字符串在其他文件中。然后,应该删除出现此字符串的所有文件,并且只有一个文件保留该字符串

例如:

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个文件,因为在撰写本文时没有提供其他信息

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个文件。一如既往,备份是您的朋友。