2

問題を解決するためにオンラインで見つけたすべてのオプションを既に試しましたが、良い結果は得られませんでした。

基本的に、2 つの csv ファイルがあります (パイプで区切られています)。

ファイル1.csv:

123|21|0452|IE|IE|1|MAYOBAN|BRIN|OFFICE|STREET|MAIN STREET|MAYOBAN|

123|21|0453|IE|IE|1|CORKKIN|ROBERT|SURNAME|CORK|APTS|CORKKIN|

123|21|0452|IE|IE|1|CORKCOR|NAME|HARRINGTON|DUBLIN|STREET|CORKCOR|

file2.csv:

MAYOBAN|BANGOR|2400

MAYOBEL|BELLAVARY|2400

CORKKIN|KINSALE|2200

CORKCOR|CORK|2200

DUBLD11|DUBLIN 11|2100

file1 の pos7 の内容に基づいて file2 から pos.3 の値を見つけるには、Linux bash スクリプトが必要です。

例:

file1, line1, pos 7: MAYOBAN
find MAYOBAN in file2, return pos 3 (2400)

出力は次のようになります。

**2400**

**2200**

**2200**

**etc...**

ヤセクを助けてください

4

4 に答える 4

5

完璧にするために少し離れたところにある小さなアプローチ:

DELIMITER="|"

for i in $(cut -f 7 -d "${DELIMITER}" file1.csv ); 
do 
    grep "${i}" file2.csv | cut -f 3 -d "${DELIMITER}"; 
done
于 2012-05-22T07:53:31.283 に答える
2

これは機能しますが、入力ファイルをソートする必要があるため、出力順序が影響を受けます。

join -t '|' -1 7 -2 1 -o 2.3 <(sort -t '|' -k7,7 file1.csv) <(sort -t '|' -k1,1 file2.csv)

出力は次のようになります。

2200
2200
2400

これは役に立たない。有用な出力を得るために、キー値を含めます。

join -t '|' -1 7 -2 1 -o 0,2.3 <(sort -t '|' -k7,7 file1.csv) <(sort -t '|' -k1,1 file2.csv)

出力は次のようになります。

CORKCOR|2200
CORKKIN|2200
MAYOBAN|2400

編集:

AWK バージョンは次のとおりです。

awk -F '|' 'FNR == NR {keys[$7]; next} {if ($1 in keys) print $3}' file1.csv file2.csv

これは file1.csv をループし、フィールド 7 の各値の配列エントリを作成します。配列要素を参照するだけで、(null 値で) 作成されます。FNRは現在のファイルのレコード番号であり、NRすべてのファイルのレコード番号です。それらが等しい場合、最初のファイルが処理されています。命令は次のnextレコードを読み取り、ループを作成します。FNR == NRが true でなくなった場合、後続のファイルが処理されます。

これで file2.csv が処理され、配列にフィールド 1 が存在する場合、そのフィールド 3 が出力されます。

于 2012-05-22T14:59:59.773 に答える
1

ミラー ( https://github.com/johnkerl/miller ) を使用できます。

input01.txtから開始

123|21|0452|IE|IE|1|MAYOBAN|BRIN|OFFICE|STREET|MAIN STREET|MAYOBAN|
123|21|0453|IE|IE|1|CORKKIN|ROBERT|SURNAME|CORK|APTS|CORKKIN|
123|21|0452|IE|IE|1|CORKCOR|NAME|HARRINGTON|DUBLIN|STREET|CORKCOR|

およびinput02.txt

MAYOBAN|BANGOR|2400
MAYOBEL|BELLAVARY|2400
CORKKIN|KINSALE|2200
CORKCOR|CORK|2200
DUBLD11|DUBLIN 11|2100

そして走っている

mlr --csv -N --ifs "|" join  -j 7 -l 7 -r 1 -f input01.txt then cut -f 3 input02.txt

あなたが持っているでしょう

2400
2200
2200

いくつかのメモ:

  • -Nヘッダーなしで入力と出力を設定します。
  • --ifs "|"入力フィールドの区切りを設定します。
  • -l 7 -r 1入力ファイルの結合フィールドを設定します。
  • cut -f 33結合出力から指定されたフィールドを抽出する
于 2020-08-31T06:54:39.983 に答える
0
cut -d\| -f7 file1.csv|while read line
do 
  grep $line file1.csv|cut -d\| -f3
done
于 2015-03-27T04:38:57.380 に答える