Как я могу извлечь строки, которые их второй столбец присутствует в другом файле? - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть два файла.«Файл данных» - это файл csv, а второй - «файл элемента», в каждой строке которого есть идентификатор элемента.Я хочу извлечь строки данных, для которых их второй столбец присутствует в «файле элементов».

Например:

  • 23,18,4,2,2,2,1, 2,1,2,1
  • 26,17,5,4,1,3,1,1,2,2,1
  • 26,18,4,4,1, 3,1,2,2,2,1
  • 26,16,1,3,1,3,1,1,2,2,1

и пунктсписок:

  • 18
  • 20

Вывод: первая и третья строки

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

та же логика может быть записана как

$ awk 'NR==FNR{a[$1]; next} $2 in a' itemlist FS=, data
0 голосов
/ 24 декабря 2018

Вот решение Perl

/tmp> cat data.csv
23,18,4,2,2,2,1,2,1,2,1
26,17,5,4,1,3,1,1,2,2,1
26,18,4,4,1,3,1,2,2,2,1
26,16,1,3,1,3,1,1,2,2,1
/tmp> cat item.lst
18
20
/tmp> perl -lne ' $kv{$_}++ if $ARGV eq "item.lst"; /,(\S+?),/ and $kv{$1} and print ' item.lst data.csv
23,18,4,2,2,2,1,2,1,2,1
26,18,4,4,1,3,1,2,2,2,1
/tmp>

Более читаемый формат

/tmp> perl -lne ' if($ARGV eq "item.lst") { $kv{$_}++ }; if( $ARGV eq "data.csv") { print if /,(\S+?),/ and $kv{$1} } ' item.lst data.csv
23,18,4,2,2,2,1,2,1,2,1
26,18,4,4,1,3,1,2,2,2,1
/tmp>
0 голосов
/ 24 декабря 2018

Это решение GNU awk:

awk 'BEGIN{FS=OFS=","} ARGIND==1{items[$1]=1} ARGIND==2 {if (items[$2]) print;}' "item file" "Data file"

ARGIND означает номер параметра командной строки, здесь представляет позицию файла.

И его можно упростить как:

awk 'BEGIN{FS=",";RS="\r?\n"} ARGIND==1{items[$1]=1} ARGIND==2 && items[$2]' "item file" "Data file"

Спасибо @karakfa и @EdMorton за эти очки улучшения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...