0

我有一个包含许多此类行的文件,其中包含一些文件的路径。

../../ds1_src/wrapper/memory/beh/mem_1w1r_8x160.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_8x134.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_8x178.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_20x68.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_280x128.v
../../ds2_src/wrapper/memory/beh/mem_1w1r_8x160.v
../../ds2_src/wrapper/memory/beh/mem_1w1r_8x134.v
../../ds2_src/wrapper/memory/beh/mem_1w1r_64x7.v
../../ds2_src/wrapper/memory/beh/mem_1w1r_24x128.v
../../ds2_src/wrapper/memory/beh/mem_1w1r_8x178.v
../../ds2_src/wrapper/memory/beh/mem_1w1r_20x68.v
../../ds2_src/wrapper/memory/beh/mem_1w1r_280x128.v
../../ds3_src/wrapper/memory/beh/mem_1w1r_1x160.v
../../ds3_src/wrapper/memory/beh/mem_1w1r_1x128.v
../../us_src/wrapper/memory/beh/mem_1w1r_128x8.v
../../us_src/wrapper/memory/beh/mem_1w1r_8x160.v
../../us_src/wrapper/memory/beh/mem_1w1r_8x178.v
../../us_src/wrapper/memory/beh/mem_1w1r_20x68.v
../../us_src/wrapper/memory/beh/mem_1w1r_280x128.v
../../src/sw/mem_1w1r_8x31.v
../../src/sw/mem_1w1r_8x35.v

其中一些是重复文件。

我希望对它进行排序和统一,以便删除重复的文件行。

% grep -r "mem_1w" rtl_list | awk '{split($$0,a,"/"); print a[7]}' | sort -u

我可以做类似上面的事情来统一文件名 - 但这会导致行的第一部分../../ds1_src/....等被砍掉。此外,在 a[5] 和../../src/sw/mem_1w1r_8x31.v.

mem_1w1r_128x8.v
mem_1w1r_145x133.v
mem_1w1r_1x128.v
mem_1w1r_1x160.v
mem_1w1r_20x68.v
mem_1w1r_24x128.v
mem_1w1r_280x128.v
mem_1w1r_64x7.v
mem_1w1r_73x133.v
mem_1w1r_8x134.v
mem_1w1r_8x160.v
mem_1w1r_8x178.v

我怎样才能解决这个问题 - 得到类似的东西 -

../../ds1_src/wrapper/memory/beh/mem_1w1r_8x160.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_8x134.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_64x7.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_1x160.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_1x128.v

这将删除存在于不同位置的任何重复文件?

4

4 回答 4

1

这是一种使用方法awk

awk -F "/" '/mem_1w/ && !a[$NF]++' file

结果:

../../ds1_src/wrapper/memory/beh/mem_1w1r_8x160.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_8x134.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_8x178.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_20x68.v
../../ds1_src/wrapper/memory/beh/mem_1w1r_280x128.v
../../ds2_src/wrapper/memory/beh/mem_1w1r_64x7.v
../../ds2_src/wrapper/memory/beh/mem_1w1r_24x128.v
../../ds3_src/wrapper/memory/beh/mem_1w1r_1x160.v
../../ds3_src/wrapper/memory/beh/mem_1w1r_1x128.v
../../us_src/wrapper/memory/beh/mem_1w1r_128x8.v
../../src/sw/mem_1w1r_8x31.v
../../src/sw/mem_1w1r_8x35.v
于 2013-02-11T12:36:02.067 回答
0
回声>输出.txt;
读F;做
    N=$(基本名称 ${F});
    grep $N output.txt 1>/dev/null || 回声 $F >> output.txt ;
完毕

当然,您可以在一条线上完成。

我认为从我得到的输入文件中你的输出也不正确(输入中没有所有文件)。

于 2013-02-11T12:22:21.167 回答
0

也许您可以使用 python 来保持文件名和现有文件路径之间的映射,例如 (key, [path1, path2 ...])。然后您可以对可能的文件路径进行排序并仅使用第一个。

import os.path
import fileinput

# dictonary to hold (key, [path1, path2 ...]) 
file_paths = {}

for line in fileinput.input("input.txt"):
    value = line.strip('\n')
    base = os.path.basename(line)

    if base in file_paths:
      # add another value to existing key
      keys = file_paths[base]
      keys.append(value)
      file_paths[base] = keys
    else:
      # init another bucket
      file_paths[base] = [value]

# print only firt value
for key in file_paths.keys():
    sl = sorted(file_paths[key])
    print sl[0]
于 2013-02-11T12:17:05.387 回答
0

您可以使用以下内容使列表按文件名唯一:

awk -F/ '!F[$NF] && F[$NF]=$0'

这将仅包括具有每个唯一名称的第一个文件的路径。然后,您可以通过管道传输结果sort,但不需要该-u选项。

这通过在 awk 中构建一个数组来工作。每个索引都是没有路径的文件名(使用-F/选项,文件名是简单的$NF)。每个元素都是具有该文件名的第一个文件的完整路径(完整路径为$0)。新的数组条目只有在文件名以前没有出现过时才会被添加和打印。

于 2013-02-11T13:39:24.550 回答