2017-09-16 1 views
-1

良い一日で2つのファイルを比較します。何か援助を探しています。は、検索可能なキー

私は2つのファイルを比較したいと思います。ファイルfile1とfile2のモックアップ内容は以下の通りです:

FILE1を:

50  0004312805201  06740   2310821                                 
50  0004986504201  00845   2310837                                 
50  0003913155201  47679   2310762                                 
50  0004997395201  2035   2311180                                 
50  0001147242201  15000   23108723                                 
50  0005771878201  13545   I3840000  

FILE2:

0003913155 A 

0005771878 A 

0004312805 A 

0000000015 B 

0000000012 B 

1111111111 E 

私が生成するファイル1からフィールド2にsubstringを実行する必要があります10 character length searchable key valueとし、file2のfield1に一致する値を見つけます。

一致が見つかった場合は、新しいフィールドとして追加されたfile2のfield2を含むfile1行全体を出力します。

一致しない場合は、file1行に新しいフィールドとして「NO」という文字列を追加して出力します。出力はファイルにリダイレクトされるのが最適です。

出力の例を以下に示します。

出力:

50  0004312805201  06740   2310821 A                                
50  0004986504201  00845   2310837 NO                                
50  0003913155201  47679   2310762 A                                
50  0004997395201  2035   2311180 NO                                
50  0001147242201  15000   23108723 NO                                
50  0005771878201  13545   I3840000 A 

はどのようにあなたたちは私がawkGNU-awkを経由して、これを取り組むことをお勧め?検索可能なキー部分文字列を準備し、awk/GNU-awkでそれを使用して配列を作成する際に問題があります。

ご協力いただければ幸いです。私はこの時点で私の車輪を回転させています。

ありがとうございました。

+1

を - そのキーは、フィールドの先頭から開始することができませんでしたか? – RomanPerekhrest

+0

[awkを使用してログファイルの列に一致させて行全体を印刷する](https://stackoverflow.com/questions/22076186/using-awk-to-match-a-column-in-log-file)の可能な複製-and-print-the-entire-line) – tk421

答えて

1
awk ' 
    FNR==NR{ a[$1]=$2; next } 
    { s=substr($2,1,10); print $0,(s in a ?a[s]:"No") } 
    ' file2 file1 > your_output_file 

入力:

$ cat file1 
50 0004312805201 06740 2310821 
50 0004986504201 00845 2310837 
50 0003913155201 47679 2310762 
50 0004997395201 2035 2311180 
50 0001147242201 15000 23108723 
50 0005771878201 13545 I3840000 

$ cat file2 
0003913155 A 
0005771878 A 
0004312805 A 
0000000015 B 
0000000012 B 
1111111111 E 

出力produce a 10 character length searchable key valueで何を意味するのかOP

$ awk 'FNR==NR{a[$1]=$2;next}{s=substr($2,1,10);print $0, (s in a ? a[s] : "No") }' file2 file1 
50 0004312805201 06740 2310821 A 
50 0004986504201 00845 2310837 No 
50 0003913155201 47679 2310762 A 
50 0004997395201 2035 2311180 No 
50 0001147242201 15000 23108723 No 
50 0005771878201 13545 I3840000 A 
+0

明日のフィードバックを確認し、コメントを返信します。応答したすべてのおかげです。 – jadeabc

0

わかりません。私はそれを次のように解釈します:file2のフィールド1の値は、file1のフィールド2の部分文字列でなければなりません

$ cat file1 
50 0004312805201 06740 2310821 
50 0004986504201 00845 2310837 
50 0003913155201 47679 2310762 
50 0004997395201 2035 2311180 
50 0001147242201 15000 23108723 
50 0005771878201 13545 I3840000 

の入力と

$ cat file2 
0003913155 A 

0005771878 A 

0004312805 A 

0000000015 B 

0000000012 B 

1111111111 E 

呼び出すTSTで

$ cat tst.awk 
/^[0-9]/ && NR==FNR { a[$1]=$2; next } # read values from file2 in array 
/^[0-9]/{ 
    f=0; 
    for (i in a){       # loop over field 1 of file2 
     if (index($2, i)){     # if i can be found in field 2 of file1 
     print $0, a[i];     # print $0 with $2 from file2 
     f++; 
     break; 
     } 
    } 
} 
/^[0-9]/ && !f{ print $0, "NO" }   # if no match, print "NO" line 

$ awk -f tst.awk file2 file1 
50 0004312805201 06740 2310821 A 
50 0004986504201 00845 2310837 NO 
50 0003913155201 47679 2310762 A 
50 0004997395201 2035 2311180 NO 
50 0001147242201 15000 23108723 NO 
50 0005771878201 13545 I3840000 A 

あるいは、onelinerを使用します:awkの出力を生成します10文字の長さは、検索キー*を生成する*

$ awk '/^[0-9]/ && NR==FNR { a[$1]=$2; next } /^[0-9]/{f=0;for (i in a){if (index($2, i)){print $0, a[i];f++;break;}}}/^[0-9]/ && !f{ print $0, "NO" }' file2 file1 
関連する問題