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] だけでなく in にも重複の可能性があり../../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

を使用する 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

以下を使用して、リストをファイル名で一意にすることができます。

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

これには、一意の名前を持つ最初のファイルへのパスのみが含まれます。その後、結果を にパイプできますが、オプションsortは必要ありません。-u

これは、awk で配列を作成することによって機能します。各インデックスは、パスのないファイル名です (-F/オプションを使用すると、ファイル名は単に になります$NF)。各要素は、そのファイル名を持つ最初のファイルへのフル パスです (フル パスは です$0)。ファイル名が以前に見られなかった場合にのみ、新しい配列エントリが追加され、印刷されます。

于 2013-02-11T13:39:24.550 に答える
0

おそらく、Python を使用して、ファイル名と既存のファイル パス (キー、[パス 1、パス 2 ...]) の間のマッピングを維持できます。次に、可能なファイル パスを並べ替えて、最初のパスのみを使用することができます。

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
エコー > output.txt;
Fを読んでいる間。行う
    N=$(ベース名 ${F});
    grep $N output.txt 1>/dev/null || echo $F >> output.txt ;
終わり

もちろん、1行で作ることもできます。

私が取得した入力ファイルからの出力も正しくないと思います(入力にすべてのファイルがあるわけではありません)。

于 2013-02-11T12:22:21.167 に答える