2017-02-20 28 views
1

Итак, у меня есть файл1.dat с индексами, которые мне нужно проверить (по одной строке) и файл file2.csv, где я хочу посчитать вхождения каждого из этих индексов по столбцу, а затем распечатать результат для каждого индекса. 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

Чтобы получить помощь в этом, вам нужно начать писать код самостоятельно - на SO мы можем помочь разрешить ошибки, но не расскажем вам, как что-то закодировать. –

+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

Здесь, если мне нужно изменить столбцы, вместо этого, вместо поиска, я бы изменил оба значения от $ 6 до $ 5? То есть: awk -F, 'FNR == NR {gsub (/ "/," ", $ 5); A [$ 5] ++; next} {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}: Когда токRecord Number равно магазины файла Номер записи ключа в a массиве, то next используется для предотвращения дальнейшей обработки для file2.csv

{print $1, $1 in a ? a[$1] : 0}: Только для file1.dat печатает первое поле, то второе значение будет число появлений в a массиве или 0, если никто не нашел. Используется оператор ternary.