我想读取一个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 中每一行的结尾,如果模式匹配则打印它