根据特定列(不是第一列)的值选择行

根据特定列(不是第一列)的值选择行

我想读取一个file.csv文件并保留文件的行(即所有列)当且仅当该文件的第六列与user_ids_to_keep.csv.

我想读取的文件file.csv如下:

Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**       
2013,1,5,2,1,1       
2013,1,5,2,1,2       
2013,1,5,2,1,3       
, etc.

我从中user_ids_to_keep.csv获取匹配 id 的 id 列表如下:

1    
3    
5    
, etc.    

output.csv我想要创建的文件应如下所示:

Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**       
2013,1,5,2,1,1       
2013,1,5,2,1,3       
,etc. 

如果列用户身份是 file.csv 文件的第一个我相信我可以使用该命令

grep -Fwf

但现在我不知道如何解决这个问题。

答案1

显示文件:

head *

...输出:

==> file.csv <==
Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**       
2013,1,5,2,1,1       
2013,1,5,2,1,2       
2013,1,5,2,1,3  

==> user_ids_to_keep.csv <==
1    
3    
5  

丑陋的 POSIX 代码(可以复制为一行):

{ read x ; echo $x ; \
  while read x ; \
  do for f in `cat user_ids_to_keep.csv` ; \
     do n=${x#${x%,*},} ; \
         if [ $n = $f ] ; \
         then echo $x ; \
              continue ; \
         fi ; \
     done ; \
  done ; } < file.csv | tee output.csv

显示:

Year,WeekOfYear,DaysInWeek,USAIsBankHoliday,holidays,**user_id**
2013,1,5,2,1,1
2013,1,5,2,1,3

答案2

可以写成一行:

paste -sd '' user_ids_to_keep.csv | sed 's/[ \t]*//' | xargs -i@ sed -n '/,[@][ \t]*$/p' file.csv

描述:

paste -sd '' user_ids_to_keep.csv

将在一行中输出文件数据,不带换行符

sed 's/[ \t]*//'

将删除先前输出中的所有空格

xargs -i@ sed -n '/,[@][ \t]*$/p' file.csv

将使用变量“@”中的先前输出作为模式来比较 file.csv 中每一行的结尾,如果模式匹配则打印它

相关内容