2017-02-20 4 views
1

インデックスを持つfile1.datがあります(行ごとにチェックする必要があります)。これらの索引を列ごとに表示し、索引ごとに結果を印刷します。 Exemple:ファイル内のインデックスの別の列への出現を列でチェックして結果を出力する方法

File1.datの:

74568 
75842 
76822 
77458 

file2.csv:

"1470009615","62353","1","y","52669","74568","php" 
"1470009617","31173","1","y","54725","31173","php" 
"1470009617","16293","1","n","58892","75842","php" 
"1470009636","50795","1","y","47004","50795","php" 

だから私が欲しいもの、この場合には、FILE1のインデックスの回数をそれぞれカウントすることです。 DATは、カラム6に表示され、このような出力(file3.dat)を生成します。

74568 1 
75842 1 
76822 0 
77458 0 

私はawkを用いたカラムでカウントするためのコードがそうである知っています

awk -F, '$6==(index)' 

しかし、リストからインデックスを取り出して結果を適切に印刷するにはどうすればよいですか? Pythonスクリプトも役に立ちます。

+0

彼らはRDBMSを発明したのはこのためです。 – e4c5

+0

この問題を解決するには、コードを自分で書く必要があります。エラーを解決するのに役立ちますが、コードを記述する方法は教えてください。 –

+0

[、ファイルをAWKと比較する](http://stackoverflow.com/questions/15065818/compare-files-with-awk) –

答えて

3
awk -F, 'FNR==NR{gsub(/"/,"",$6);A[$6]++;next}{print $1,A[$1]+0}' file2.csv file1.dat 

入力

$ cat file1.dat 
74568 
75842 
76822 
77458 

$ cat file2.csv 
"1470009615","62353","1","y","52669","74568","php" 
"1470009617","31173","1","y","54725","31173","php" 
"1470009617","16293","1","n","58892","75842","php" 
"1470009636","50795","1","y","47004","50795","php" 

出力

$ awk -F, 'FNR==NR{gsub(/"/,"",$6);A[$6]++;next}{print $1,A[$1]+0}' file2.csv file1.dat 
74568 1 
75842 1 
76822 0 
77458 0 
+1

'、' de-limiterを使用するための '++'は、同じ論理! – Inian

+1

非常に良い答え++ – anubhava

+0

ここで列を変更する必要がある場合、代わりに列5を検索すると、$ 6から$ 5に変更されますか?これは: awk -F、 'FNR == NR {gsub(/ "/" "$ 5); A [$ 5] ++;次の} {print $ 1、A [$ 1] +0}' file2.csv file1.dat –

0

このawkは、問題を解決:

awk -F\" 'NR==FNR{a[$12]++;next}{print $1,$1 in a ? a[$1] : 0}' file2.csv file1.dat 

説明

NR==FNR{a[$12]++;next}現在のレコード番号ファイルレコード番号にa配列のキーと等しい場合、 nextは、のさらなる処理を避けるために使用されます

{print $1, $1 in a ? a[$1] : 0}は:ちょうどfile1.datための第1のフィールドを印刷誰が見つからない場合、第2の値はa配列または0における出現回数であろう。 ternary演算子が使用されます。

関連する問題