我有两个文件。 “数据文件”是一个csv文件,第二个是“项目文件”,在每行中都有一个项目ID。我想提取第二行出现在“项目文件”中的数据行。
例如:
,项目列表为:
输出:第一和第三行
答案 0 :(得分:2)
相同的逻辑可以写为
$ awk 'NR==FNR{a[$1]; next} $2 in a' itemlist FS=, data
答案 1 :(得分:1)
这些是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这些改进点。
答案 2 :(得分:1)
这是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>