我在特定目录中有几个文件。 一个文件中的特定字符串可以出现在另一个文件中。 如果此字符串在其他文件中。然后应删除发生此字符串的所有文件,并且只有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上。
答案 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
正常工作。