如何提取第二行出现在其他文件中的行?

时间:2018-12-24 12:04:41

标签: shell awk

我有两个文件。 “数据文件”是一个csv文件,第二个是“项目文件”,在每行中都有一个项目ID。我想提取第二行出现在“项目文件”中的数据行。

例如:

  • 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 :(得分: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>