根据输入行中的模式为文件创建输出

时间:2015-04-02 14:07:12

标签: shell unix awk

我有一个文件列表,包含许多这样的行:

./file_name_0.jpg
./file_name_1.jpg
./file_name_2.jpg
./file_name_3.jpg
./file_name_4.jpg
./file_name_5.jpg
./file_name.jpg
./file_name1_0.jpg
./file_name1_1.jpg
./file_name1.jpg
./file_name2_0.jpg
./file_name2_1.jpg
./file_name2_2.jpg
./file_name2_3.jpg
./file_name2_4.jpg
./file_name2_5.jpg
./file_name2.jpg

在上面的列表中,我有两个文件,我知道这些文件已被复制了6次。我希望删除这些重复项。如果文件复制的次数少于6次,我希望文件保留。

换句话说,我想要实现的是删除文件名包含所有变体的所有文件_0.jpg_1.jpg_2.jpg_3.jpg,最后_4.jpg_5.jpg

对于上面的输入,我希望这样的输出

rm ./file_name_0.jpg
rm ./file_name_1.jpg
rm ./file_name_2.jpg
rm ./file_name_3.jpg
rm ./file_name_4.jpg
rm ./file_name_5.jpg
# ./file_name.jpg    # do not remove, it is the original file.
# ./file_name1_0.jpg # do not remove, it is a legitimate copy.
# ./file_name1_1.jpg # do not remove, it is a legitimate copy.
# ./file_name1.jpg   # do not remove, it is the original file.
rm ./file_name2_0.jpg
rm ./file_name2_1.jpg
rm ./file_name2_2.jpg
rm ./file_name2_3.jpg
rm ./file_name2_4.jpg
rm ./file_name2_5.jpg
# ./file_name2.jpg

我遇到的困难是确保file_name1_1.jpg这样的文件不被删除 - 这是一个合法的文件,因为该集合中的重复项少于6个。

2 个答案:

答案 0 :(得分:0)

这不是完全解决您的问题,因为它实际上并不确保文件0-5在那里。相反,它只检查那里有6个后缀文件:

grep _ temp.txt | cut -d_ -f1 | sort | uniq -c | \
 grep '^ *6' | sed -e 's/^ *6 /rm /' -e 's/$/_*.jpg/'

首先它用下划线字符隔离线,然后它只获得第一个下划线之前的部分,然后它对所有内容进行排序,然后计算每个前缀的出现次数,然后它只抓取出现6次的前缀,然后它用rm替换计数,并在末尾添加一个glob,以匹配具有该前缀的所有文件。

答案 1 :(得分:0)

这是一个可执行的awk脚本,它将指示所需的文件到" rm":

#!/usr/bin/awk -f

BEGIN {FS="_"}

{ sub(FS $NF "$", ""); key=$0 } # make a key by dropping the last field

{ cnts[key]++ }         # count how many matching prefixes there are

END {
  for(key in cnts) {            # for a count `key` in cnts
    if(cnts[key]==6) {          # check to see if the `key` cnt is 6
      for(i=0;i<6;i++) {        # if it is build an output line for each case
        print "rm " key FS i ".jpg"   # make the output `command` here.
      }
    }
  }
}

这不会显示已保留的行。它仅为应删除的每个文件创建rm命令。另请注意,它假设每个文件都以&#34; .jpg&#34;结尾。输出的顺序无法保证,但如果您需要订购,可以通过sort传送。这也适用于文件名中出现_的情况。

根据您的输入,它会产生:

rm ./filename2_0.jpg
rm ./filename2_1.jpg
rm ./filename2_2.jpg
rm ./filename2_3.jpg
rm ./filename2_4.jpg
rm ./filename2_5.jpg
rm ./filename_0.jpg
rm ./filename_1.jpg
rm ./filename_2.jpg
rm ./filename_3.jpg
rm ./filename_4.jpg
rm ./filename_5.jpg
相关问题