Используя csvkit
, можно сделать
$ csvsql --query 'SELECT b.* FROM log AS a JOIN log AS b USING (user_id) WHERE a.winner="win"' log.csv
id,user_id,winner,page_id
1,user_1,win,1
2,user_1,,10
5,user_4,win,10
6,user_5,,2
7,user_5,win,3
Но я не уверен, что это будет очень быстро на огромном входном файле. По умолчанию база данных SQLite создается, заполняется и запрашивается в фоновом режиме.
Однако это можно сделать и непосредственно в оболочке:
$ join -t ',' -1 2 -2 2 log.csv log.csv | awk -v FS=',' -v OFS=',' '$3 == "win" { print $5,$1,$6,$7 }'
1,user_1,win,1
2,user_1,,10
5,user_4,win,10
6,user_5,,2
7,user_5,win,3
Опять же, я не уверен, как это масштабируется для больших файлов. Кроме того, входной файл должен быть отсортирован по столбцу 2 (, что соответствует данным примера ).
Ваша переменная оболочки не будет расширяться внутри одинарных кавычек, используемых для программы awk.
Вы можете передать переменную оболочки в awk, используя опцию -v
:
food=pizza
awk -v food="$food" '$4 == food'