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

时间:2009-11-21 15:10:31

标签: shell scripting

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

示例:

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”的值出现在file2&文件3。这个文件都应该删除。与其他ShortName类似的文件 任何人都可以帮助我如何通过脚本(ksh,SED,AWK)完成。我在solaris上。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

此脚本查找所有重复项,并且只留下每个重复项的一个示例。例如,假设有三个“Blue Jean”文件,两个“Plaid Shirt”文件,一个“Sneakers”文件和几个没有“ShortName”的文件。运行此脚本后,您应该分别拥有一个:“Blue Jeans”,“Plaid Shirt”和“Sneakers”以及其他文件应该不受影响。价格和货币完全被忽略。

偏执的免责声明:这是丑陋的并且保证会爆炸。买者自负。没有退款。

#!/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

在您对其进行测试后移除echo以使rm正常工作。