2

このファイルのようなファイルがあり、各行の 1 つのフィールドを確認し、そのフィールドがファイルの前に重複している場合は文言を追加しようとしています。

\\FILE04\BUET-PCO;\\SERVER24\DFS\SHARED\CORP\ET\PROJECT CONTROL OFFICE;/FS7_150a/FILE04/BU-D/PROJECT CONTROL OFFICE;10000bytes;9888;;;
\\FILE12\BUAG-GOLDMINE$;\\SERVER24\DFS\SHARED\CAN\AGENCY\GOLDMINE;/FS3_150a/FILE12/BU/AGENCY/GOLDMINE;90000bytes;98834;;;
\\FILE12\BUGB-BUSINTEG$;\\SERVER24\DFS\SHARED\CAN\GB\BUSINTEG;/FS3_150a/FILE12/BU/GB/BUSINTEG;50000bytes;988822;;;
\\FILE12\BUGB-BUSINTEG$;\\SERVER24\DFS\SHARED\CAN\GB\BUSINTEG;/FS3_150a/FILE12/BU/GB/BUSINTEG;50000bytes;988822;other stuff;;

この例では、回線 #3 と #4 に同じ物理パスがあります。/FS3_150a/FILE12/BU/GB/BUSINTEG などの 3 番目のフィールドを同じファイルと比較できるスクリプトが必要です。正確な一致が見つかった場合は、両方のケースで「行番号と同じ物理パス」などを出力します。 、

\\FILE04\BUET-PCO;\\SERVER24\DFS\SHARED\CORP\ET\PROJECT CONTROL OFFICE;/FS7_150a/FILE04/BU-D/PROJECT CONTROL OFFICE;10000bytes;9888;;;
\\FILE12\BUAG-GOLDMINE$;\\SERVER24\DFS\SHARED\CAN\AGENCY\GOLDMINE;/FS3_150a/FILE12/BU/AGENCY/GOLDMINE;90000bytes;98834;;;
\\FILE12\BUGB-BUSINTEG$;\\SERVER24\DFS\SHARED\CAN\GB\BUSINTEG;/FS3_150a/FILE12/BU/GB/BUSINTEG;50000bytes;988822;;;Same Physical Path as Line #4
\\FILE12\BUGB-BUSINTEG$;\\SERVER24\DFS\SHARED\CAN\GB\BUSINTEG;/FS3_150a/FILE12/BU/GB/BUSINTEG;50000bytes;988822;other stuff;; Same Physical Path as Line #3
4

2 に答える 2

2

このコードは、問題の単純化されたバージョンに取り組みます。フィールド 3 の前の行と比較して重複値を含む各行を識別します。後続の重複がある行のタグ付けは処理しません。

awk -F';' '{ tag = ""
             if (field3[$3] != 0) tag = " Same physical path as line " field3[$3]
             else field3[$3] = NR
             printf "%s%s\n", $0, tag
           }' "$@"

整理する方法は他にもあると思いますが、キー ポイントは、連想配列を使用してfield3、フィールド 3 に表示される名前と、特定の名前が最初に表示された行番号を追跡することです。これは、単一の入力ファイルを処理していることを前提としています。複数のファイルを処理する必要がある場合は、FNR などを検索します (ただし、同じ名前が異なるファイルに表示されるかどうかを決定する必要があります)。

指定されたデータでほぼ希望どおりに機能します。

\\FILE04\BUET-PCO;\\SERVER24\DFS\SHARED\CORP\ET\PROJECT CONTROL OFFICE;/FS7_150a/FILE04/BU-D/PROJECT CONTROL OFFICE;10000bytes;9888;;;
\\FILE12\BUAG-GOLDMINE$;\\SERVER24\DFS\SHARED\CAN\AGENCY\GOLDMINE;/FS3_150a/FILE12/BU/AGENCY/GOLDMINE;90000bytes;98834;;;
\\FILE12\BUGB-BUSINTEG$;\\SERVER24\DFS\SHARED\CAN\GB\BUSINTEG;/FS3_150a/FILE12/BU/GB/BUSINTEG;50000bytes;988822;;;
\\FILE12\BUGB-BUSINTEG$;\\SERVER24\DFS\SHARED\CAN\GB\BUSINTEG;/FS3_150a/FILE12/BU/GB/BUSINTEG;50000bytes;988822;other stuff;; Same physical path as line 3

3 行目の「タグ」を作成する際の難しさは、将来を予測することです。それは難しい。これを行うには、ファイル全体をメモリに丸呑みし、フィールド 3 の特定の値が表示される行番号 (一般に、行番号の広範なリストである可能性があります) にタブを保持し、その後、データと適切なタグ付け。非常に、非常に困難です。その仕事には Perl を使用したいと思いawkますが、おそらくデータを正しく整理することも可能awkです。

私だったら、仕事の 90% が完了していれば問題ありません。重複のある行が識別されます。最後の 10% を完了させたい場合は、最初のフェーズに予定されている時間の残りの 90% がかかることを想定してください。

于 2012-09-27T23:34:03.087 に答える
1

を使用する 1 つの方法を次に示しGNU awkます。少しハックっぽいです、YMMV。次のように実行します。

awk -f script.awk file.txt{,}

の内容script.awk:

BEGIN {
    FS = ";"
}

FNR==NR {
    array[$3]=array[$3] "#" NR
    next
}

{
    if ($3 in array && array[$3] ~ /#.#/) {
        copy = array[$3]
        sub("#"FNR, "", copy)
        printf "%s Same Physical Path as Line as %s\n", $0, copy
    }
    else {
        print
    }
}

結果:

\\FILE04\BUET-PCO;\\SERVER24\DFS\SHARED\CORP\ET\PROJECT CONTROL OFFICE;/FS7_150a/FILE04/BU-D/PROJECT CONTROL OFFICE;10000bytes;9888;;;
\\FILE12\BUAG-GOLDMINE$;\\SERVER24\DFS\SHARED\CAN\AGENCY\GOLDMINE;/FS3_150a/FILE12/BU/AGENCY/GOLDMINE;90000bytes;98834;;;
\\FILE12\BUGB-BUSINTEG$;\\SERVER24\DFS\SHARED\CAN\GB\BUSINTEG;/FS3_150a/FILE12/BU/GB/BUSINTEG;50000bytes;988822;;; Same Physical Path as Line as #4
\\FILE12\BUGB-BUSINTEG$;\\SERVER24\DFS\SHARED\CAN\GB\BUSINTEG;/FS3_150a/FILE12/BU/GB/BUSINTEG;50000bytes;988822;other stuff;; Same Physical Path as Line as #3
于 2012-09-28T00:07:09.413 に答える